Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何反序列化python打印字典?_Python_Dictionary_Deserialization - Fatal编程技术网

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

如何反序列化python打印字典?,python,dictionary,deserialization,Python,Dictionary,Deserialization,我在数据库中使用了python的str字典表示形式作为varchars,我想检索原始python字典 如何根据词典的str表示再次拥有词典 例子 在本例中,将dicstr转换回可用的python字典。使用ast.literal\u eval(),在这种情况下,首选repr()而不是str(),因为str()不能保证字符串可以转换回有用的对象 In [7]: import ast In [10]: dic = {u'key-a':u'val-a', "key-b":"val-b"} In [1

我在数据库中使用了python的str字典表示形式作为varchars,我想检索原始python字典

如何根据词典的str表示再次拥有词典

例子 在本例中,将dicstr转换回可用的python字典。

使用
ast.literal\u 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'}
您可以使用
eval()
ast.literal\u 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\u eval
可能是简单dict的一种方式,但您可能应该重新考虑您的设计,而不是首先将此类文本保存在数据库中。e、 g

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

import ast
print ast.literal_eval(repr(d))
这将不起作用,并抛出
ValueError(“格式错误的字符串”)
如果dict包含任何非基本类型,则基本上不会转换回dict

更好的方法是使用pickle或json或类似的东西转储dict,例如

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

import json
print json.loads(json.dumps(d))

摘要:使用
repr
进行序列化,使用
ast进行反序列化。literal\u eval
不好,使用
json进行序列化。转储
和使用
json进行反序列化。加载
很好

顺便问一下,它们是Python字典还是json对象?很容易混淆这两个:)Python字典。我认为json不允许使用
u'sth'
语法(查看unicode中的
u
)不,但我看不到您的真实数据,可以吗?JSON在数据库中比Python <代码> RePR 编码对象更频繁地出现,所以我想我会指出这一点,以防万一。如果你是数据库,你可能想考虑使用<代码>泡菜< /代码>模块,而不是<代码> RePr>代码>(除非你希望数据也能被人阅读)。。我认为像
shelve
pickle
这样的模块也适合存储python对象。我之前没有说过这一点,但数据看起来像我发布的一样,只有unicode和str值的字典。最终,我会像你在总结中说的那样做。非常感谢你!repr是否保证反向转换?dict中的numpy数组不起作用。这对其他人来说不是一个不安全的答案吗??不要求值字符串使用
json
包。@johnsimer回答使用的不是
eval()
,而OPs字符串不是json。
import collections
d = {'a':1, 'b': collections.defaultdict()}

import json
print json.loads(json.dumps(d))