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

2024-10-17 08:24:57 发布

您现在位置: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字典。


Tags: key数据库示例字典val例子词典str
3条回答

您可以使用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'}

对于简单的dict来说,ast.literal_eval可能是这样做的,但是您可能应该重新考虑您的设计,而不是首先将这样的文本保存到数据库中。e、 g

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

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

这不起作用,抛出ValueError('malformed string')基本上,如果dict包含任何非基本类型,就不会被转换回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反序列化良好

使用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'}

相关问题 更多 >