3

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

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

我的工作流程如下:

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

当我做:

dict(s)

我得到:

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

当我这样做时:

json.loads(s)

我明白了:

ValueError:期望属性名称:第 1 行第 1 列(字符 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, 6, 24, 10, 23) )}, 'old_home_num': u'16047207276', 'old_cell_num': u''}

在这种情况下,带有json.loadsast.literal_eval()的选项不合适。所以我更进一步并尝试使用pickle标准python库对其进行反序列化。

进口泡菜

pickle.loads(数据)

但后来我得到:

键错误:'{'

4

3 回答 3

10

如果你想要一个可移植的字符串表示,使用s = json.dumps(d)它可以重新加载使用json.loads(s)

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

要创建一个可加载的字符串,pickle.loads()您需要使用从原始对象创建它pickle.dumps()(即,就像您使用的那样,jsonpickle改为使用)。

但是,如果您已经发布了该字符串,则可以使用eval(s)将其评估为 python 表达式。虽然这通常是一个坏主意,并且使用 repr 仅适用于实际上具有有效 python 代码的 repr 的对象。

于 2013-09-23T14:44:20.957 回答
7

尝试使用ast.literal_eval(),这是最安全的方法:

import ast
ast.literal_eval('{1:2}')
=> '{1:2}'

从链接的文档中:

安全地评估表达式节点或包含 Python 表达式的字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

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

于 2013-09-23T14:42:47.043 回答
1

尝试这个:

import pickle

pickle.loads(data)

这东西曾经救过我一次。

于 2013-09-26T03:34:48.917 回答