web-dev-qa-db-ja.com

文字列をdictに変換しますか?

辞書を文字列に変更し、ファイルに保存するスクリプトがあります。それからそのファイルをロードして辞書として使用したいのですが、それは文字列です。 dict(_{a: 1, b: 2}_)としてフォーマットされた文字列をdictに変更できるint("7")のようなものはありますか?私はdict()を試しましたが、これはそれがすることではないようです。 JSONとeval()を含むプロセスについて聞いたことがありますが、実際にこれが何をするのかわかりません。プログラムは保存したのと同じデータをロードし、誰かがそれを編集して機能しなくても問題ありません(dictデータなどを確認するための高度な方法は必要ありません)。

24
tkbx

これを試してください、それは最も安全な方法です:

_import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}
_

eval()に基づくすべてのソリューションは危険であり、悪意のあるコードが文字列内に挿入されて実行される可能性があります。

ドキュメント によると、式は安全に評価されます。また、 ソースコード に従って、_literal_eval_は文字列をpython AST(ソースツリー)に解析し、次の場合にのみ返しますリテラル。コードは実行されることはなく、解析されるだけなので、セキュリティリスクになる理由はありません。

53
Óscar López

この形式はJSONではなくYAMLであり、 PyYAML で解析できます:

>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
13
phihag

入力文字列を信頼する場合は、evalを使用できます。

>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
7
Matthew Adams

連載

あなたが話しているのは オブジェクトのシリアル化 であり、独自のシリアル化メソッドを展開するよりも良い方法があります(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}
4
Matthew Adams