25

我有一个脚本,可以将 dict 更改为字符串并将其保存到文件中。然后我想加载该文件并将其用作字典,但它是一个字符串。有没有类似的东西int("7")可以将格式化为 dict ( {a: 1, b: 2}) 的字符串更改为 dict ?我试过dict()了,但这似乎不是它的作用。我听说过一些涉及 JSON 和 的过程eval(),但我真的不明白这是做什么的。该程序加载它保存的相同数据,如果有人编辑它并且它不起作用,那不是我的问题(我不需要任何高级方法来确认 dict 数据或任何东西)。

4

4 回答 4

56

试试这个,这是最安全的方法:

import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}

所有基于的解决方案eval()都是危险的,恶意代码可能被注入到字符串中并被执行。

根据文档,表达式得到安全评估。另外,根据源代码literal_eval将字符串解析为python AST(源树),并且仅在它是文字时才返回。代码永远不会被执行,只会被解析,所以没有理由让它成为安全风险。

于 2012-12-03T01:33:05.793 回答
15

这种格式不是 JSON,而是 YAML,您可以使用PyYAML 对其进行解析:

>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>
于 2012-12-03T01:32:36.147 回答
8

eval如果您信任输入字符串,则可以使用。

>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
于 2012-12-03T01:31:43.987 回答
4

序列化

您所说的是对象序列化,并且有比滚动您自己的序列化方法更好的方法(尽管您似乎已经提出了 YAML)。这两种方法仍然不如ast.literal_eval()方法安全(pickle特别是),但在这里绝对应该注意它们。

JSON

下面是一个使用流行的跨语言格式JSON做你想做的事的例子:

import json

myDict = {'a':1, 'b':2}

# write to the file 'data'
with open('data','w') as f:
    json.dump(myDict, f)

# now we can load it back
with open('data','r') as f:
    myDictLoaded = json.load(f)

print myDictLoaded

输出:

{u'a': 1, u'b': 2}

泡菜

这是第二个使用pickle做同样事情的例子。pickle更强大的是它可以序列化所有* python 对象,甚至是您编写的对象。

import cPickle as pickle

myDict = {'a':1, 'b':2}

# write to the file 'data'
with open('data','w') as f:
    pickle.dump(myDict, f)

# now we can load it back
with open('data','r') as f:
    myDictLoaded = pickle.load(f)

print myDictLoaded

输出:

{'a': 1, 'b': 2}
于 2012-12-03T15:23:26.233 回答