辞書を文字列に変更してファイルに保存するスクリプトがあります。次に、そのファイルをロードしてdictとして使用したいのですが、それは文字列です。int("7")
dict () として書式設定された文字列を dict に変更できるようなものはあり{a: 1, b: 2}
ますか? 試してみましdict()
たが、これはそうではないようです。JSON と を含むプロセスについて聞いたことがありますがeval()
、これが何をするのかはよくわかりません。プログラムは保存したのと同じデータをロードし、誰かがそれを編集して機能しない場合、それは私の問題ではありません (dict データなどを確認するための高度な方法は必要ありません)。
4 に答える
これを試してみてください。これが最も安全な方法です。
import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}
に基づくすべてのソリューションeval()
は危険であり、悪意のあるコードが文字列内に挿入されて実行される可能性があります。
ドキュメントによると、式は安全に評価されます。また、ソース コードによると、文字列を python AST (ソース ツリー)にliteral_eval
解析し、リテラルの場合にのみ返します。コードが実行されることはなく、解析されるだけなので、セキュリティ リスクになる理由はありません。
この形式は JSON ではなく、PyYAMLで解析できる YAMLです。
>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
eval
入力文字列を信頼する場合に使用できます。
>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
シリアル化
あなたが話しているのはオブジェクトのシリアライゼーションであり、独自のシリアライゼーション メソッドを展開するよりも良い方法があります (YAML を思いついたようですが)。これらはどちらもast.literal_eval()
アプローチよりも安全性が低くなりますが (pickle
特に)、ここで注意する必要があります。
JSON
以下は、一般的な言語間フォーマットであるJSONを使用して、必要なことを行う例です。
import json
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
json.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = json.load(f)
print myDictLoaded
出力:
{u'a': 1, u'b': 2}
ピクルス
pickleを使用して同じことを行う 2 番目の例を次に示します。pickle
あなたが書いたものも含めて、すべての* Pythonオブジェクトをシリアライズできるという点で、より強力です。
import cPickle as pickle
myDict = {'a':1, 'b':2}
# write to the file 'data'
with open('data','w') as f:
pickle.dump(myDict, f)
# now we can load it back
with open('data','r') as f:
myDictLoaded = pickle.load(f)
print myDictLoaded
出力:
{'a': 1, 'b': 2}