将字符串转换为字典

Pol*_*Pol 3 python serialization json dictionary pickle

我知道这看起来像一个愚蠢的问题,但无论如何.

我正在尝试将字典的字符串表示转换回字典.

我的工作流程如下:

d = {1:2}
s = str(d)
Run Code Online (Sandbox Code Playgroud)

当我做:

dict(s)
Run Code Online (Sandbox Code Playgroud)

我明白了:

ValueError:字典更新序列元素#0的长度为1; 2是必需的

当我这样做时:

json.loads(s)
Run Code Online (Sandbox Code Playgroud)

我明白了:

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),'地址':{'country':u'US','state':u'CA','zip':你','city':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.loadsast.literal_eval()不合适.所以我进一步尝试用pickle标准python库反序列化它.

进口泡菜

pickle.loads(数据)

但后来我得到:

KeyError:'{'

Thi*_*ter 10

如果你想要一个可移植的字符串表示,s = json.dumps(d)那么可以使用它来重新加载json.loads(s)

但是,这仅限于JSON兼容类型.如果你只想在python中使用它,最强大的选择是pickle(小心:永远不要破坏不受信任的数据!).

要创建一个可加载的字符串,pickle.loads()您需要使用原始对象创建它pickle.dumps()(即就像您一样,jsonpickle改为使用).

但是,如果您已经发布了该字符串,则可以eval(s)将其用作python表达式.这通常是一个坏主意,并且使用repr仅适用于实际具有有效python代码的repr的对象.


Ósc*_*pez 7

尝试使用ast.literal_eval(),这是最安全的方式:

import ast
ast.literal_eval('{1:2}')
=> '{1:2}'
Run Code Online (Sandbox Code Playgroud)

从链接的文档:

安全地评估表达式节点或包含Python表达式的字符串.提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None.

这可以用于安全地评估包含来自不可信来源的Python表达式的字符串,而无需自己解析值.