2つの列で構成されるファイルがあります。
1 a
2 b
3 c
このファイルを辞書に読み込んで、列1がキー、列2が値になるようにします。つまり、
d = {1:'a', 2:'b', 3:'c'}
ファイルは小さいので、効率は問題ではありません。
2つの列で構成されるファイルがあります。
1 a
2 b
3 c
このファイルを辞書に読み込んで、列1がキー、列2が値になるようにします。つまり、
d = {1:'a', 2:'b', 3:'c'}
ファイルは小さいので、効率は問題ではありません。
回答:
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
with
ここでは、ファイルのクリーンアップを処理するために使用されます。(通常の実行フローまたは例外によって)ブロックを離れると、ファイルは自動的に閉じられます。Pythonのコンテキストマネージャーの詳細については、こちらをご覧ください。effbot.org
for line in open("file.txt"):
同じ方法でクリーンアップを行います。また、fがローカル値のf
場合、スコープが失われたときに解放されます。このステートメントが役立つ唯一のケースは、長い関数(品質が良くない)、またはグローバル変数を使用する場合です。
for line in open('file.txt')
は、同じ方法でクリーンアップを行いません。すべてのPython実装が同じというわけではありません。 with
ブロックが終了したときにファイルが閉じられることを保証します。ときにfor
ラインが完了すると、close
もと呼ばれます。 CPython
それはできますが、などのバージョンには、IronPython
ガベージコレクターの遅延があります。
これはキーを文字列として残します:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
dict([line.split() for line in f])
で十分です、imo。
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)で説明されているように、リスト内包ではなくジェネレータ式です。新しいことを学びました!
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)
partition
?とwith
声明?
partition
より速く、まさにこの目的のために作成されます。
with
それがそうであることを確認する簡単な方法です。
strip
だと思います。
辞書理解
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]
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)
re
?真剣に?
split()
ファイル形式が正気でない場合、ほとんど何の問題もなく動作しません。
ここに別のオプションがあります...
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:]