将字符串转换为字典

时间:2013-09-23 14:41:42

标签: python json serialization dictionary pickle

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

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

我的工作流程如下:

d = {1:2}
s = str(d)

当我这样做时:

dict(s)

我明白了:

  
    

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

  

当我这样做时:

json.loads(s)

我明白了:

  
    

ValueError:期望属性名称:第1行第1列(char 1)

  

如何将其转换回字典?

UPDATE:

我应该提一下,实际数据如下:

  

{'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.loadsast.literal_eval()的选项不合适。 所以我进一步尝试用pickle标准python库对它进行反序列化。

  

导入泡菜

     

pickle.loads(数据)

但后来我得到了:

  

KeyError:'{'

3 个答案:

答案 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)

这件事在过去曾经让我失望过。