如何将字符串转换为字典或列表?
Posted
技术标签:
【中文标题】如何将字符串转换为字典或列表?【英文标题】:How can I convert string to dict or list? 【发布时间】:2015-06-25 02:48:34 【问题描述】:我有这样的字符串:
'[1, 2, 3]'
和
"'a': 1, 'b': 2"
如何将它们转换为列表/字典?
有人提到ast.literal_eval
或eval
可以解析转换为list/dict的字符串。
ast.literal_eval
和 eval
有什么区别?
【问题讨论】:
【参考方案1】:将此字符串转换为 dict 的 python 脚本:-
import json
inp_string = '"1":"one", "2":"two"'
out = json.loads(inp_string)
print out["1"]
O/P 就像:
"one"
【讨论】:
【参考方案2】:您可以通过ast.literal_eval()
或eval()
函数将字符串转换为列表/字典。 ast.literal_eval()
只认为 Python 语法的一小部分是有效的:
提供的字符串或节点只能由以下 Python 组成 文字结构:字符串、数字、元组、列表、字典、布尔值、 和无。
将__import__('os').system('rm -rf /')
传递给ast.literal_eval()
会引发错误,但eval()
会愉快地擦除您的驱动器。
由于您似乎只允许用户输入普通字典,因此请使用 ast.literal_eval()
。它可以安全地做您想做的事,仅此而已。
【讨论】:
【参考方案3】:ast.literal_eval
解析“抽象语法树”。你几乎在那里有 json,你可以使用 json.loads
,但你需要双引号,而不是单引号,字典键才有效。
import ast
result = ast.literal_eval("'a': 1, 'b': 2")
assert type(result) is dict
result = ast.literal_eval("[1, 2, 3]")
assert type(result) is list
另外,这没有eval
的风险,因为它不涉及评估函数的业务。 eval("subprocess.call(['sudo', 'rm', '-rf', '/'])")
可以删除您的根目录,但 ast.literal_eval("subprocess.call(['sudo', 'rm', '-rf', '/'])")
可以预见地失败,您的文件系统完好无损。
【讨论】:
【参考方案4】:您可以eval()
,但只能使用安全数据。否则,如果您解析不安全的数据,请查看更安全的ast.literal_eval()
。
JSON解析器也是一种可能,大多数python dicts和lists语法相同。
【讨论】:
【参考方案5】:使用 eval 函数:
l = eval('[1, 2, 3]')
d = eval("'a':1, 'b': 2")
只要确保您知道这些字符串的来源,并且您不允许评估用户输入并做一些恶意的事情。
【讨论】:
以上是关于如何将字符串转换为字典或列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 字典列表转换为 Snowflake 中的字符串列表?