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()在这种情况下使用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'}
于 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可能是简单的 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是好的

于 2012-10-31T19:05:54.123 回答