将字符串转换为dict?

时间:2012-12-03 01:29:04

标签: python string dictionary

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

4 个答案:

答案 0 :(得分:53)

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

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

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

根据documentation表达式得到安全评估。此外,根据source codeliteral_eval将字符串解析为python AST(源树),并且只有在它是文字时才返回。代码永远不会执行,只会被解析,因此没有理由存在安全风险。

答案 1 :(得分:13)

此格式不是JSON,而是YAML,您可以使用PyYAML进行解析:

>>> import yaml
>>> s = '{a: 1, b: 2}'
>>> d = yaml.load(s)
>>> d
{'a': 1, 'b': 2}
>>> type(d)
<type 'dict'>

答案 2 :(得分:7)

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

>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}

答案 3 :(得分:4)

序列化

你在谈论的是object serialization,并且有更好的方法来实现它而不是滚动你自己的序列化方法(尽管你似乎已经提出了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}