私が持っているテキストファイルから辞書を作成したいのですが、その内容は「辞書」形式です。ファイルに含まれるもののサンプルを次に示します。
{'fawn':[1]、 'sermersheim':[3]、 'sonji':[2]、 'scheuring':[2]}
125,000のエントリが含まれていることを除いて、まさにこれです。 read()を使用してテキストファイルを読み込むことはできますが、変数を初期化しても、ファイルのリテラルテキストの変数が作成されます
dict = {}
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
ステートメントの利点はそれを行うことです。
eval
を使用すると危険な場合があります。 jsonが機能しない場合は、 yaml を使用することをお勧めします。これは、入力例でうまく機能するようです:
>>> import yaml
>>> yaml.load("{'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}")
{'fawn': [1], 'scheuring': [2], 'sermersheim': [3], 'sonji': [2]}
それは生産準備のできたソリューションではなく、あなたのサイズのファイルではうまく動作しないかもしれませんが、簡単な方法が必要で、ファイルを
my_dict = {'fawn': [1], 'sermersheim': [3], 'sonji': [2], 'scheuring': [2]}
次に、名前をpythonファイルに変更し、単にインポートすることができます
from my_file import my_dict
ただし、eval
を使用することは強くお勧めしません。入力ファイルを完全に制御できない場合、セキュリティ上の問題が発生する可能性があります。辞書をインポートして、json
またはpickle
モジュールを使用して保存します。
これは私にとってjsonのように見えます。その場合は、json
モジュールを使用します。
これはyamlのように見えます。 pyyamlモジュール を使用します。 (@jcolladoの提案どおり)。
json
モジュールは入力が厳密であるため使用できません。