文章目录
- 一文讲透ast.literal_eval() eval() json.loads()
- 1. ast.literal_eval()
- 2. eval()
- 3. json.loads()
- 4. 总结
一文讲透ast.literal_eval() eval() json.loads()
在Python库中,我们经常会遇到需要将字符串转换为相应对象或数据结构的情况。在这种情况下,我们可以使用ast.literal_eval()
、eval()
和json.loads()
这三个函数来进行转换。然而,它们之间有一些重要的区别。
1. ast.literal_eval()
这个函数位于ast
模块中,主要用于将字符串安全地转换为Python字面量表达式的值。它可以处理字符串、数字、元组、列表、字典和布尔值等常见的Python数据类型。与eval()
不同,ast.literal_eval()
不会执行任意的Python代码,因此更加安全。它适用于需要将字符串转换为Python数据类型的场景。
ast.literal_eval()
的使用例子:
import ast
s = "[1, 2, 3]"
lst = ast.literal_eval(s)
print(lst)
print(type(lst))
输出:
[1, 2, 3]
<class 'list'>
在这个例子中,我们使用ast.literal_eval()
将字符串s
转换为列表lst
。结果显示,lst
是一个包含了整数元素的列表,与字符串s
的内容相匹配。
2. eval()
eval()
函数可以将字符串作为Python代码进行求值,并返回结果。这意味着它可以执行任意的Python代码。然而,由于它的强大性,eval()
函数的使用可能存在安全风险,特别是当执行的代码来自不可信的来源时。因此,在处理用户输入或其他不可信数据时,最好避免使用eval()
函数。
eval()
的使用例子:
s = "print('Hello, World!')"
eval(s)
输出:
Hello, World!
在这个例子中,我们使用eval()
执行字符串s
中的Python代码。结果是打印出了Hello, World!
。
请注意,eval()
函数可以执行任意的Python代码,这也就意味着它可能执行一些有害的操作,比如删除文件或访问敏感数据。因此,在处理不可信数据时,应避免使用eval()
函数。
3. json.loads()
这个函数位于json
模块中,专门用于将JSON字符串转换为相应的Python对象。它可以处理JSON字符串中的基本数据类型(如字符串、数字、布尔值)以及列表和字典等复杂数据结构。与eval()
类似,json.loads()
也是安全的,因为它只能解析JSON格式的字符串,而不会执行任意的Python代码。它适用于处理JSON数据的场景。
json.loads()
的使用例子:
import json
s = '{"name": "Alice", "age": 25, "city": "New York"}'
data = json.loads(s)
print(data)
print(type(data))
输出:
{'name': 'Alice', 'age': 25, 'city': 'New York'}
<class 'dict'>
在这个例子中,我们使用json.loads()
将JSON字符串s
转换为Python字典data
。结果显示,data
是一个包含了键值对的字典,与JSON字符串s
的内容相匹配。
4. 总结
ast.literal_eval()
用于将字符串转换为Python数据类型,如列表、字典等,是安全且有限制的。eval()
可以执行任意的Python代码,但存在安全风险,应避免使用。json.loads()
用于将JSON字符串转换为Python对象,如字典、列表等,是安全的且仅限于处理JSON数据。