8.1 什么是序列化
在你学会了如何处理文件,保存和读取数据之后,现在是时候深入学习文件操作了。今天我们开始学习序列化。
序列化 是将对象转换为字节序列或格式的过程,可以将其保存到文件中,通过网络传输或保存在数据库中。反序列化 是相反的过程,从字节序列中重建原始对象。
要保存对象到文件(或通过网络传输),需要将其转换为容易写入文件(以及从文件中读取)或通过网络传输的字符串(或字节集)。
下面是序列化的四个主要用途:
- 保存对象状态:为了在程序的不同运行之间保存对象的状态。
- 数据传输:在系统的不同组件或不同系统之间传输对象。
- 缓存:将对象保存在缓存中以便快速访问。
- 数据库:在数据库中存储复杂的数据结构。
进行序列化的库非常多,每个库都有其特定的用途。我们将介绍五个库,其中两个将详细介绍。
让我们来看看最受欢迎的库:
- 模块
pickle
- 模块
json
- 模块
yaml
- 模块
marshal
- 模块
shelve
下面是每个模块的简要概述:
8.2 模块 pickle
pickle
是一个用于 序列化 和 反序列化 Python 对象的内置模块。它允许保存和恢复几乎任何 Python 对象,包括自定义类。
pickle
的使用示例:
import pickle
# 用于序列化的对象示例
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# 将对象序列化到文件
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# 从文件反序列化对象
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
8.3 模块 json
json
是一个用于处理 JSON(JavaScript Object Notation)的内置模块。JSON 是一种文本格式,用于客户端和服务器之间的数据交换。
json
的使用示例:
import json
# 用于序列化的对象示例
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# 将对象序列化为 JSON 字符串
json_string = json.dumps(data)
print(json_string)
# 将对象序列化为 JSON 文件
with open('data.json', 'w') as file:
json.dump(data, file)
# 从 JSON 字符串反序列化对象
loaded_data = json.loads(json_string)
print(loaded_data)
# 从 JSON 文件反序列化对象
with open('data.json', 'r') as file:
loaded_data = json.load(file)
print(loaded_data)
8.4 模块 yaml
yaml
(YAML Ain't Markup Language) 是一种可读性高的数据序列化格式。Python 中使用 PyYAML 库来处理 YAML。
yaml
的使用示例:
import yaml
# 用于序列化的对象示例
data = {'name': 'Carol', 'age': 27, 'is_student': False}
# 将对象序列化为 YAML 字符串
yaml_string = yaml.dump(data)
print(yaml_string)
# 将对象序列化为 YAML 文件
with open('data.yaml', 'w') as file:
yaml.dump(data, file)
# 从 YAML 字符串反序列化对象
loaded_data = yaml.load(yaml_string, Loader=yaml.FullLoader)
print(loaded_data)
# 从 YAML 文件反序列化对象
with open('data.yaml', 'r') as file:
loaded_data = yaml.load(file, Loader=yaml.FullLoader)
print(loaded_data)
8.5 模块 marshal
marshal
是一个用于序列化 Python 对象的内置模块,用于序列化 Python 代码。它比 pickle
更快,但支持的对象类型更少,也没有那么灵活。
marshal
的使用示例:
import marshal
# 用于序列化的对象示例
data = {'name': 'Dave', 'age': 35, 'is_student': True}
# 将对象序列化到文件
with open('data.marshal', 'wb') as file:
marshal.dump(data, file)
# 从文件反序列化对象
with open('data.marshal', 'rb') as file:
loaded_data = marshal.load(file)
print(loaded_data)
8.6 模块 shelve
shelve
是一个内置模块,提供了一种简单的方法来使用基于键的存储类似字典的方式将 Python 对象保存到文件。
shelve
的使用示例:
import shelve
# 用于序列化的对象示例
data = {'name': 'Eve', 'age': 28, 'is_student': False}
# 将对象序列化到文件
with shelve.open('data.shelve') as db:
db['person'] = data
# 从文件反序列化对象
with shelve.open('data.shelve') as db:
loaded_data = db['person']
print(loaded_data)
虽然模块和数据保存格式不同,但从程序员的角度来看,它们的使用非常相似。接下来,我们将更详细地介绍 模块 pickle
和 模块 json
的使用。
GO TO FULL VERSION