7.4 数据序列化与反序列化
数据序列化是将数据结构或对象转换为可存储或传输的格式的过程,而反序列化则是将序列化后的数据重新转换为原始数据结构或对象的过程。Python 提供了多种方式来实现数据的序列化与反序列化,常用的方法包括使用 json、pickle 和 yaml 等模块。
7.4.1 JSON 序列化与反序列化
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于 Web 开发和数据传输。Python 的 json 模块提供了对 JSON 数据的支持。
序列化(将 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)
文件中的 JSON 序列化与反序列化:
# 序列化到文件
with open('data.json', 'w') as f:
json.dump(data, f)
# 从文件反序列化
with open('data.json', 'r') as f:
data = json.load(f)
print(data)
7.4.2 Pickle 序列化与反序列化
pickle 是 Python 特有的序列化模块,它可以将几乎所有的 Python 对象转换为字节流,并且可以将其反序列化为原始对象。pickle 的序列化格式是 Python 特有的,因此不适合跨语言使用。
序列化(将 Python 对象转换为字节流):
import pickle
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Art"]
}
byte_stream = pickle.dumps(data)
print(byte_stream)
反序列化(将字节流转换为 Python 对象):
data = pickle.loads(byte_stream)
print(data)
文件中的 Pickle 序列化与反序列化:
# 序列化到文件
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 从文件反序列化
with open('data.pkl', 'rb') as f:
data = pickle.load(f)
print(data)
7.4.3 YAML 序列化与反序列化
YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换。Python 的 yaml 模块提供了对 YAML 数据的支持。
安装 pyyaml 模块:
pip install pyyaml
序列化(将 Python 对象转换为 YAML 字符串):
import yaml
data = {
"name": "Charlie",
"age": 28,
"is_student": False,
"courses": ["Physics", "Chemistry"]
}
yaml_str = yaml.dump(data)
print(yaml_str)
反序列化(将 YAML 字符串转换为 Python 对象):
yaml_str = '''
name: Charlie
age: 28
is_student: false
courses:
- Physics
- Chemistry
'''
data = yaml.safe_load(yaml_str)
print(data)
文件中的 YAML 序列化与反序列化:
# 序列化到文件
with open('data.yaml', 'w') as f:
yaml.dump(data, f)
# 从文件反序列化
with open('data.yaml', 'r') as f:
data = yaml.safe_load(f)
print(data)
7.4.4 序列化与反序列化的选择
- JSON:适合跨语言的数据交换,支持基本数据类型和简单的数据结构。
- Pickle:适合 Python 内部使用,支持几乎所有 Python 对象,但不安全且不适合跨语言使用。
- YAML:适合人类可读的配置文件,支持复杂的数据结构,但性能不如 JSON 和 Pickle。
7.4.5 安全性考虑
- JSON:相对安全,但需要注意反序列化时的数据类型。
- Pickle:不安全,反序列化时可能执行任意代码,应避免反序列化不受信任的数据。
- YAML:使用
yaml.safe_load可以避免反序列化时的安全问题。
通过合理选择序列化与反序列化的方法,可以有效地处理数据的存储与传输需求。
