我知道这看起来像一个愚蠢的问题,但无论如何。
我正在尝试将字典的字符串表示转换回字典。
我的工作流程如下:
d = {1:2}
s = str(d)
当我这样做时:
dict(s)
我明白了:
ValueError:字典更新序列元素#0的长度为1; 2是必需的
当我这样做时:
json.loads(s)
我明白了:
ValueError:期望属性名称:第1行第1列(char 1)
如何将其转换回字典?
我应该提一下,实际数据如下:
{'cell_num':你','home_num':u'16047207276','registration_country': u'US','registration_ip':u'71.102.221.29','last_updated': datetime.datetime(2010,9,27,15,41,59),'address':{'country': u'US','state':u'CA','zip':你','城市':u'Santa Barbara','street': 你','确认':错误,'创建':datetime.datetime(2010,6,24,10, 23),'updated':datetime.datetime(2010,6,24,10,23)}, 'old_home_num':u'16047207276','old_cell_num':你'}}
在这种情况下,json.loads
和ast.literal_eval()
的选项不合适。
所以我进一步尝试用pickle标准python库对它进行反序列化。
导入泡菜
pickle.loads(数据)
但后来我得到了:
KeyError:'{'
答案 0 :(得分:10)
如果您想要一个可移植的字符串表示形式,请使用s = json.dumps(d)
,然后可以使用json.loads(s)
重新加载
但是,这仅限于JSON兼容类型。如果你只想在python中使用它,最强大的选项是pickle
(小心:永远不要破坏不受信任的数据!)。
要使用pickle.loads()
创建可加载的字符串,您需要使用pickle.dumps()
从原始对象创建它(即就像使用json
但使用pickle
一样代替)。
但是,如果您已经发布了该字符串,则可以使用eval(s)
将其评估为python表达式。这通常是一个坏主意,并且使用repr仅适用于实际具有有效python代码的repr的对象。
答案 1 :(得分:7)
尝试使用ast.literal_eval()
,这是最安全的方式:
import ast
ast.literal_eval('{1:2}')
=> '{1:2}'
来自链接文档:
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None。
这可用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自己解析值。
答案 2 :(得分:1)
试试这个:
import pickle
pickle.loads(data)
这件事在过去曾经让我失望过。