ファイルを辞書に変換する方法は?


94

2つの列で構成されるファイルがあります。

1 a 
2 b 
3 c

このファイルを辞書に読み込んで、列1がキー、列2が値になるようにします。つまり、

d = {1:'a', 2:'b', 3:'c'}

ファイルは小さいので、効率は問題ではありません。

回答:


154
d = {}
with open("file.txt") as f:
    for line in f:
       (key, val) = line.split()
       d[int(key)] = val

1
with文について説明してもらえますか?
VGE、2011年

12
withここでは、ファイルのクリーンアップを処理するために使用されます。(通常の実行フローまたは例外によって)ブロックを離れると、ファイルは自動的に閉じられます。Pythonのコンテキストマネージャーの詳細については、こちらをご覧ください。effbot.org
Vlad H

1
for line in open("file.txt"):同じ方法でクリーンアップを行います。また、fがローカル値のf場合、スコープが失われたときに解放されます。このステートメントが役立つ唯一のケースは、長い関数(品質が良くない)、またはグローバル変数を使用する場合です。
VGE、2011年

1
@VGE for line in open('file.txt')は、同じ方法でクリーンアップを行いませ。すべてのPython実装が同じというわけではありません。 withブロックが終了したときにファイルが閉じられることを保証します。ときにforラインが完了すると、close と呼ばれます。 CPythonそれはできますが、などのバージョンには、IronPythonガベージコレクターの遅延があります。
Mark Tolonen 2013

2
ここでintは本当に必要ですか?おそらく彼は数字を文字列にしたかったのでしょうか?
GL2014 2014年

15

これはキーを文字列として残します:

with open('infile.txt') as f:
  d = dict(x.rstrip().split(None, 1) for x in f)

2
シンプルdict([line.split() for line in f])で十分です、imo。
user225312 2011年

@sukhbir:質問を読むと、それがオペレーションの望みではないことがわかります。
SilentGhost 2011年

@SilentGhost:OPはキーを整数として要求することを読みましたが、Ignacioのソリューション(および私が削除したもの)には、キーが文字列として含まれています(Ignacio自身が指摘)。
user225312 2011年

dict引数を渡すときになぜ[]が必要ないのか混乱しました。つまりのdict([x.rstrip().split(None, 1) for x in f])代わりにdict(x.rstrip().split(None, 1) for x in f)。同じことを考える人にとって、前者はpython.org/dev/peps/pep-0289(PEP-289)で説明されているように、リスト内包ではなくジェネレータ式です。新しいことを学びました!
peaxol 2017年

1
@peaxol:中間リストを作成しないために、リスト内包表記の代わりにジェネレータ式を使用します。
Ignacio Vazquez-Abrams

7

Pythonのバージョンが2.7以降の場合、次のようなdict内包表記を使用することもできます。

with open('infile.txt') as f:
  {int(k): v for line in f for (k, v) in (line.strip().split(None, 1),)}

5
def get_pair(line):
    key, sep, value = line.strip().partition(" ")
    return int(key), value

with open("file.txt") as fd:    
    d = dict(get_pair(line) for line in fd)

1
なんでpartition?とwith声明?
SilentGhost 2011年

@SilentGhost:パーティションについて知りませんでした!しかし、この場合str.splitの方が良いのはなぜですか?「と」に関して:多分あなたは私のためにこれを明確にすることができます:ファイル記述子が閉じられるために範囲外に出るのに十分ではありませんか?例外ではファイルmainは開いたままなので、変更します。
フォークランド、2011年

partitionより速く、まさにこの目的のために作成されます。
SilentGhost 2011年

記述子が閉じているかどうかは、実装の詳細です。withそれがそうであることを確認する簡単な方法です。
SilentGhost 2011年

それでもまだ必要stripだと思います。
SilentGhost 2011年

3

辞書理解

d = { line.split()[0] : line.split()[1] for line in open("file.txt") }

またはパンダによって

import pandas as pd 
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]

パンダによってのみ、最初の列を取る
Maulikマダビ

1
@Samer Ayoubキーと値の両方が1語である場合、上記のソリューション(辞書内包)は機能します。テキストファイルに次のデータが含まれている場合。年をキーに、勝者チームを値にするにはどうすればよいですか。1903ボストンアメリカ人1904ノーワールドシリーズ1905ニューヨークジャイアンツ1906シカゴホワイトソックス1907シカゴカブス1908シカゴカブス
リディ

1
@Ridhi返信が遅れてすみません。あなたは最初のスペース上のいずれかの分割しかでき stackoverflow.com/questions/30636248/... 分割のための引数として、あるいは使用して、正規表現を()
SAMERアヨブ

@ SamerAyoub-ありがとうございます。
リディ

1

ジェネレーターを使用するためにもう少しpythonicのIMHO(おそらくこれには2.7+が必要です):

with open('infile.txt') as fd:
    pairs = (line.split(None) for line in fd)
    res   = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}

これにより、整数で始まらない、またはちょうど2つの項目を含まない行も除外されます


0
import re

my_file = open('file.txt','r')
d = {}
for i in my_file:
  g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string
  d[int(g.group(1))] = g.group(2)

9
re?真剣に?
SilentGhost 2011年

これが最善のアプローチだとは思いません。
ドノバン

@Seafoidは、「ファイルは小さいので、効率は問題になりません」と述べました。split()ファイル形式が正気でない場合、ほとんど何の問題もなく動作しません。
VGE、2011年

0

1つのライナーが大好きな場合は、以下を試してください。

d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')

入力FILE =ファイルへのパス、SEP =キーと値の区切り文字

それを行うための最もエレガントまたは効率的な方法ではありませんが、それでも非常に興味深い:)


0

ここに別のオプションがあります...

events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
    if line[0][0] == "#":
        continue
    events[line[0]] = line[1] if len(line) == 2 else line[1:]

0

シンプルなオプション

辞書を格納するためのほとんどのメソッドは、JSON、Pickle、または行読みを使用します。Python以外で辞書を編集していない場合、この単純な方法で複雑な辞書でも十分です。大きな辞書にはピクルスの方が良いでしょう。

x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w'))    # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y)                   # >>> True
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.