25

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

4

4 に答える 4

56

これを試してみてください。これが最も安全な方法です。

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

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

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

于 2012-12-03T01:33:05.793 に答える
15

この形式は JSON ではなく、PyYAMLで解析できる YAMLです。

>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
于 2012-12-03T01:32:36.147 に答える
8

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

>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
于 2012-12-03T01:31:43.987 に答える
4

シリアル化

あなたが話しているのはオブジェクトのシリアライゼーションであり、独自のシリアライゼーション メソッドを展開するよりも良い方法があります (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}
于 2012-12-03T15:23:26.233 に答える