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.loads和ast.literal_eval()不合适.所以我进一步尝试用pickle标准python库反序列化它.
进口泡菜
pickle.loads(数据)
但后来我得到:
KeyError:'{'
Thi*_*ter 10
如果你想要一个可移植的字符串表示,s = json.dumps(d)那么可以使用它来重新加载json.loads(s)
但是,这仅限于JSON兼容类型.如果你只想在python中使用它,最强大的选择是pickle(小心:永远不要破坏不受信任的数据!).
要创建一个可加载的字符串,pickle.loads()您需要使用原始对象创建它pickle.dumps()(即就像您一样,json但pickle改为使用).
但是,如果您已经发布了该字符串,则可以eval(s)将其用作python表达式.这通常是一个坏主意,并且使用repr仅适用于实际具有有效python代码的repr的对象.
尝试使用ast.literal_eval(),这是最安全的方式:
import ast
ast.literal_eval('{1:2}')
=> '{1:2}'
Run Code Online (Sandbox Code Playgroud)
从链接的文档:
安全地评估表达式节点或包含Python表达式的字符串.提供的字符串或节点可能只包含以下Python文字结构:字符串,数字,元组,列表,dicts,布尔值和None.
这可以用于安全地评估包含来自不可信来源的Python表达式的字符串,而无需自己解析值.
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |