我在数据库中有 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 字典。
我在数据库中有 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 字典。
ast.literal_eval()
在这种情况下使用and 优先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'}
您可以使用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'}
ast.literal_eval
可能是简单的 dicts 的方法,但是您可能应该重新考虑您的设计,而不是首先将此类文本保存在数据库中。例如
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
是好的