web-dev-qa-db-ja.com

Python:辞書形式のテキスト/ファイルから辞書を作成する

私が持っているテキストファイルから辞書を作成したいのですが、その内容は「辞書」形式です。ファイルに含まれるもののサンプルを次に示します。

{'fawn':[1]、 'sermersheim':[3]、 'sonji':[2]、 'scheuring':[2]}

125,000のエントリが含まれていることを除いて、まさにこれです。 read()を使用してテキストファイルを読み込むことはできますが、変数を初期化しても、ファイルのリテラルテキストの変数が作成されます

dict = {}

21
Jared

eval ビルトインを使用できます。たとえば、各辞書エントリが異なる行にある場合、これは機能します。

_dicts_from_file = []
with open('myfile.txt','r') as inf:
    for line in inf:
        dicts_from_file.append(eval(line))    
# dicts_from_file now contains the dictionaries created from the text file
_

または、ファイルが1つの大きな辞書である場合(複数行であっても)、これを行うことができます。

_with open('myfile.txt','r') as inf:
    dict_from_file = eval(inf.read())
_

これはおそらく最も簡単な方法ですが、最も安全ではありません。他の回答で言及したように、evalには固有のセキュリティリスクがあります。 JBernardoが言及した代替案は、 _ast.literal_eval_ を使用することです。これは、リテラルを含む文字列のみを評価するため、evalよりもはるかに安全です。 evalモジュールをインポートした後、上記の例のastへのすべての呼び出しを_ast.literal_eval_に置き換えることができます。

Python 2.4を使用している場合、astモジュールを使用する予定はなく、 with ステートメント:コードは次のようになります。

_inf = open('myfile.txt','r')
dict_from_file = eval(inf.read())
inf.close()
_

inf.close()を呼び出すことを忘れないでください。 withステートメントのコードブロックで例外が発生した場合でも、withステートメントの利点はそれを行うことです。

28

evalを使用すると危険な場合があります。 jsonが機能しない場合は、 yaml を使用することをお勧めします。これは、入力例でうまく機能するようです:

>>> import yaml
>>> yaml.load("{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}")
{'fawn': [1], 'scheuring': [2], 'sermersheim': [3], 'sonji': [2]}
3
jcollado

それは生産準備のできたソリューションではなく、あなたのサイズのファイルではうまく動作しないかもしれませんが、簡単な方法が必要で、ファイルを

my_dict = {'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}

次に、名前をpythonファイルに変更し、単にインポートすることができます

from my_file import my_dict 
2
user1587520

eval 関数を使用します。

例えば、

dict = eval(open("yourfile.txt").read())
2
DynamiteReed

ただし、evalを使用することは強くお勧めしません。入力ファイルを完全に制御できない場合、セキュリティ上の問題が発生する可能性があります。辞書をインポートして、jsonまたはpickleモジュールを使用して保存します。

1
nopper

これは私にとってjsonのように見えます。その場合は、jsonモジュールを使用します。

これはyamlのように見えます。 pyyamlモジュール を使用します。 (@jcolladoの提案どおり)。

jsonモジュールは入力が厳密であるため使用できません。

0
Marcin