6.5 json 与 pickle 模块
概述
在 Python 中,json 和 pickle 是两个常用的模块,用于数据的序列化和反序列化。它们可以将 Python 对象转换为可存储或传输的格式,并在需要时重新恢复为 Python 对象。尽管它们的功能相似,但它们的应用场景和特性有所不同。
1. json 模块
json 模块用于处理 JSON(JavaScript Object Notation)格式的数据。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
1.1 序列化与反序列化
序列化:将 Python 对象转换为 JSON 字符串。
import json data = { "name": "Alice", "age": 30, "is_student": False, "courses": ["Math", "Science"] } json_str = json.dumps(data) print(json_str)反序列化:将 JSON 字符串转换为 Python 对象。
json_str = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}' data = json.loads(json_str) print(data)
1.2 文件操作
json 模块还提供了直接从文件读取和写入 JSON 数据的功能。
写入文件:
with open('data.json', 'w') as f: json.dump(data, f)读取文件:
with open('data.json', 'r') as f: data = json.load(f)
1.3 高级用法
自定义序列化:可以通过
default参数指定一个函数来处理无法直接序列化的对象。def custom_serializer(obj): if isinstance(obj, set): return list(obj) raise TypeError(f"Object of type {type(obj)} is not JSON serializable") data = {"name": "Alice", "hobbies": {"reading", "traveling"}} json_str = json.dumps(data, default=custom_serializer)美化输出:使用
indent参数可以使 JSON 输出更具可读性。json_str = json.dumps(data, indent=4)
2. pickle 模块
pickle 模块用于序列化和反序列化 Python 对象。与 json 不同,pickle 可以处理几乎所有的 Python 对象,包括自定义类和函数。
2.1 序列化与反序列化
序列化:将 Python 对象转换为字节流。
import pickle data = { "name": "Alice", "age": 30, "is_student": False, "courses": ["Math", "Science"] } byte_stream = pickle.dumps(data)反序列化:将字节流转换回 Python 对象。
data = pickle.loads(byte_stream)
2.2 文件操作
pickle 模块也支持直接从文件读取和写入序列化数据。
写入文件:
with open('data.pkl', 'wb') as f: pickle.dump(data, f)读取文件:
with open('data.pkl', 'rb') as f: data = pickle.load(f)
2.3 注意事项
- 安全性:
pickle模块在反序列化时会执行任意代码,因此不应反序列化来自不可信来源的数据。 - 兼容性:
pickle生成的字节流是 Python 特有的,不同版本的 Python 之间可能存在兼容性问题。
3. json 与 pickle 的比较
| 特性 | json | pickle |
|---|---|---|
| 数据格式 | 文本格式(JSON) | 二进制格式 |
| 可读性 | 高 | 低 |
| 安全性 | 安全 | 不安全 |
| 支持的数据类型 | 基本数据类型、列表、字典等 | 几乎所有 Python 对象 |
| 跨语言兼容性 | 是 | 否 |
4. 应用场景
json:适用于需要跨语言交换数据的场景,如 Web API 的数据传输。pickle:适用于需要保存和恢复 Python 对象状态的场景,如机器学习模型的持久化。
5. 总结
json 和 pickle 模块在 Python 中扮演着重要的角色,分别适用于不同的场景。json 更适合于跨平台和跨语言的数据交换,而 pickle 则更适合于 Python 内部的复杂对象序列化。在实际开发中,应根据具体需求选择合适的模块。
