我知道这看起来像一个愚蠢的问题,但无论如何.
我正在尝试将字典的字符串表示转换回字典.
我的工作流程如下:
d = {1:2}
s = str(d)
当我做:
dict(s)
我明白了:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
当我这样做时:
json.loads(s)
我明白了:
ValueError: Expecting property name: line 1 column 1 (char 1)
如何将其转换回字典?
更新:
我应该提一下,实际数据如下:
{‘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 Barbara’,‘street’: u”,‘confirmed’: False,‘created’: datetime.datetime(2010,6,24,10, 23),‘updated’: datetime.datetime(2010,23)}, ‘old_home_num’: u’16047207276′,‘old_cell_num’: u”}
在这种情况下,使用json.loads和ast.literal_eval()的选项是不合适的. 所以我进一步尝试用pickle标准python库反序列化它.
import pickle
pickle.loads(data)
但后来我得到:
KeyError: ‘{‘
解决方法
如果你想要一个可移植的字符串表示,使用s = json.dumps(d),然后可以使用json.loads(s)重新加载
但是,这仅限于JSON兼容类型.如果你只想在python中使用它,最强大的选项是pickle (小心:永远不要破坏不受信任的数据!).
要使用pickle.loads()创建一个可加载的字符串,您需要使用pickle.dumps()从原始对象创建它(即就像您使用json但使用pickle一样).
但是,如果您已经发布了该字符串,则可以使用eval(s) 将其评估为python表达式.这通常是一个坏主意,并且使用repr仅适用于实际具有有效python代码的repr的对象.
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|