将字符串转换为dict?

tkb*_*kbx 24 python string dictionary

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

Ósc*_*pez 53

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

import ast
ast.literal_eval("{'x':1, 'y':2}")
=> {'y': 2, 'x': 1}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不知道'ast`模块,感谢这个! (3认同)

phi*_*hag 13

这种格式不是JSON,而是YAML,你可以用PyYAML解析:

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


Mat*_*ams 7

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

>>> a=eval('{"a":1,"b":2}')
>>> a
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)

  • 但是,为了完整起见,应该注意使用"eval"通常是一个坏主意. (2认同)
  • @tkbx在这种特殊情况下真的很重要吗?可能不是.但这个原则绝对重要.如果编写Microsoft Word的人采用相同的方法会怎么样?如果黑客发现他们为了获得对系统的控制而必须做的就是修改一个文件,那么这使得他们的"工作"变得更加容易.考虑到安全性而编写代码是件好事. (2认同)