辞書を文字列に変更し、ファイルに保存するスクリプトがあります。それからそのファイルをロードして辞書として使用したいのですが、それは文字列です。 dict(_{a: 1, b: 2}
_)としてフォーマットされた文字列をdictに変更できるint("7")
のようなものはありますか?私はdict()
を試しましたが、これはそれがすることではないようです。 JSONとeval()
を含むプロセスについて聞いたことがありますが、実際にこれが何をするのかわかりません。プログラムは保存したのと同じデータをロードし、誰かがそれを編集して機能しなくても問題ありません(dictデータなどを確認するための高度な方法は必要ありません)。
この形式はJSONではなくYAMLであり、 PyYAML で解析できます:
>>> 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 [〜#〜] (一般的なクロス言語フォーマット)を使用して、必要な処理を行う例を次に示します。
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}