我在数据库中将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字典。
答案 0 :(得分:11)
使用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'}
答案 1 :(得分:1)
您可以使用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'}
答案 2 :(得分:1)
ast.literal_eval
可能是简单的dicts的方法,但你可能应该重新考虑你的设计,而不是首先在数据库中保存这样的文本。 e.g。
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
反序列化为BAD,使用json.dumps
序列化,使用json.loads
反序列化为GOOD