如何反序列化python打印字典?

时间:2012-10-31 18:38:56

标签: python dictionary deserialization

我在数据库中将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字典。

3 个答案:

答案 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