2

データベースにPythonのstrディクショナリ表現がvarcharsとしてあり、元のpythonディクショナリを取得したい

辞書のstr表現に基づいて、辞書を再び作成するにはどうすればよいですか?

>>> dic = {u'key-a':u'val-a', "key-b":"val-b"}
>>> dicstr = str(dic)
>>> dicstr
"{'key-b': 'val-b', u'key-a': u'val-a'}"

この例では、dicstrを使用可能なPython辞書に戻します。

4

3 に答える 3

12

文字列を有用なオブジェクトに変換できることを保証するものではないast.literal_eval()ため、このような場合は、を使用してください。repr()str()str()

In [7]: import ast

In [10]: dic = {u'key-a':u'val-a', "key-b":"val-b"}

In [11]: strs = repr(dic)

In [12]: strs
Out[12]: "{'key-b': 'val-b', u'key-a': u'val-a'}"

In [13]: ast.literal_eval(strs)
Out[13]: {u'key-a': u'val-a', 'key-b': 'val-b'}
于 2012-10-31T18:40:30.327 に答える
2

eval()またはを使用できますast.literal_eval()。ほとんどのrepr()文字列は、元のオブジェクトに評価して戻すことができます。

>>> import ast
>>> ast.literal_eval("{'key-b': 'val-b', u'key-a': u'val-a'}")
{'key-b': 'val-b', u'key-a': u'val-a'}
于 2012-10-31T18:41:31.123 に答える
1

ast.literal_eval単純な辞書の場合はそれを行う方法かもしれませんが、おそらく設計を再考し、最初にそのようなテキストをデータベースに保存しないでください。例えば

import collections
d = {'a':1, 'b': collections.defaultdict()}

import ast
print ast.literal_eval(repr(d))

これは機能せず、ValueError('malformed string')基本的に、非基本型が含まれている場合は dict に変換されません。

より良い方法は、pickle や json などを使用して dict をダンプすることです。

import collections
d = {'a':1, 'b': collections.defaultdict()}

import json
print json.loads(json.dumps(d))

まとめ: を使用してreprシリアライズ、 を使用してデシリアライズするast.literal_evalのは悪い、 を使用json.dumpsしてシリアライズし、 を使用してデシリアライズするjson.loadsのは良い

于 2012-10-31T19:05:54.123 に答える