Python 将字符串转换为字典

Python 将字符串转换为字典,python,json,serialization,dictionary,pickle,Python,Json,Serialization,Dictionary,Pickle,我知道这看起来是个愚蠢的问题,但无论如何 我正在尝试将字典的字符串表示形式转换回字典 我的工作流程如下: d = {1:2} s = str(d) 当我这样做时: dict(s) 我得到: ValueError:字典更新序列元素#0的长度为1;2是必需的 当我这样做的时候: json.loads(s) 我明白了: ValueError:应为属性名称:第1行第1列(字符1) 如何将其转换回字典 更新: 我应该提到的是,实际数据如下: d = {1:2} s = str(d) {'cell_

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

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

我的工作流程如下:

d = {1:2}
s = str(d)
当我这样做时:

dict(s)
我得到:

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

当我这样做的时候:

json.loads(s)
我明白了:

ValueError:应为属性名称:第1行第1列(字符1)

如何将其转换回字典

更新: 我应该提到的是,实际数据如下:

d = {1:2}
s = str(d)
{'cell_num':u','home_num':u'16047207276','registration_country': u'US',“注册ip”:u'71.102.221.29',“上次更新”: datetime.datetime(2010,9,27,15,41,59),“地址”:{“国家”: u'US',州:u'CA',邮编:u',城市:u'Santa Barbara',街道: u“”,“已确认”:False,“已创建”:datetime.datetime(2010,6,24,10, 23),“更新”:datetime.datetime(2010,6,24,10,23)}, 'old_home_num':u'16047207276','old_cell_num':u'}

在这种情况下,带有
json.loads
ast.literal\u eval()
的选项是不合适的。 所以我进一步尝试用pickle标准python库对其进行反序列化

进口泡菜

pickle.load(数据)

但我得到:

KeyError:“{”

尝试使用,这是最安全的方式:

import ast
ast.literal_eval('{1:2}')
=> '{1:2}'
从链接的文档中:

安全地计算表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文本结构组成:字符串、数字、元组、列表、dicts、boolean和None

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


如果需要可移植的字符串表示,请使用
s=json.dumps(d)
,然后可以使用
json.loads(s)

但是,这仅限于JSON兼容类型。如果您只想在python中使用它,最强大的选项是(小心:永远不要取消拾取不受信任的数据!)

要使用
pickle.loads()
创建可加载的字符串,您需要使用
pickle.dumps()
从原始对象创建该字符串(即,与使用
json
一样,而是使用
pickle

但是,如果您已经发布了该字符串,则可以将其作为python表达式进行计算。但这通常不是一个好主意,使用repr仅适用于实际具有有效python代码的repr的对象。

尝试以下方法:

import pickle

pickle.loads(data)

这件事在过去救了我一次。

你从来没有调用过
obj。
直接-使用
str(obj)
来代替。但是,这不是你想要的:)使用
json
模块来代替…实际上数据如下:
{'cell_num':u','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','city':u'Santa barbarra','street':u','u','confirated','False','created':datetime(2010,6,24,10,23),'updated':datetime.datetime(2010,6,24,10,23)},'old_home_num':u'16047207276','old_cell_num':u'}
在你的例子中,我得到了不同的错误:
ValueError:格式错误的字符串
我认为这是一个很好的解决方案。@Pol这是因为
datetime
对象,
literal\u eval()
解析它们似乎有困难。如果字典由简单的数据类型组成,我的解决方案将是首选。但遗憾的是,它对实际数据不起作用:(@Pol也许你应该将该数据放在问题本身中,因为它似乎与给出正确答案相关。实际数据如下:{'cell_num':u','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','city':u'Santa barbarra','street':u','u','confirated','False','created':datetime(2010,6,24,10,23),'updated':datetime.datetime(2010,6,24,10,23)},'old_home_num':u'16047207276','old_cell_num':u'}好的,因为日期时间的关系,所以它与JSON不兼容。Pickle是最简单的解决方案。它是unicode。
JSON.loads()
也返回unicode。