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。