第3课python的序列化
热度🔥:58 免费课程
授课语音
Python的序列化
1. 定义
在Python中,序列化是将对象转换为字节流,以便于存储或传输的过程。常见的序列化库包括:
- pickle: 可以将Python对象序列化为二进制格式,并在反序列化时恢复为原始对象。支持所有Python对象,但安全性较低。
- json: 将Python对象(如字典)序列化为JSON文本格式。JSON格式人类可读,且跨语言兼容,广泛应用于实际项目中;但不支持所有Python对象,如自定义类实例。
- marshal: 用于序列化Python内部对象,速度较快,适合基本数据类型;但不支持自定义实例。
- shelve: 类似于字典的数据库,将Python对象持久化存储,内部使用了pickle,但安全性较低。
2. 代码案例
# 1. 使用 pickle 库进行序列化和反序列化
import pickle
# 要序列化的数据,包含姓名、年龄和城市
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}
try:
# 以二进制写入模式打开文件
with open('data.pkl', 'wb') as file:
# 使用pickle的dump方法将数据写入文件
pickle.dump(data, file)
print("数据已序列化到 data.pkl")
except IOError as e:
print(f"序列化失败: {e}")
# 反序列化对象从文件
try:
# 以二进制读取模式打开文件
with open('data.pkl', 'rb') as file:
# 使用pickle的load方法从文件读取数据
loaded_data = pickle.load(file)
print(f"从 data.pkl 反序列化的数据: {loaded_data}")
except (IOError, pickle.PickleError) as e:
print(f"反序列化失败: {e}")
# 2. 使用 json 库进行序列化和反序列化
import json
# 要序列化的数据
data = {'name': 'Bob', 'age': 25, 'city': 'Los Angeles'}
try:
# 以写入模式打开JSON文件
with open('data.json', 'w', encoding='utf-8') as file:
# 使用json的dump方法将数据写入文件
json.dump(data, file, ensure_ascii=False, indent=4)
print("数据已序列化到 data.json")
except IOError as e:
print(f"序列化失败: {e}")
# 反序列化对象从 JSON 文件
try:
# 以读取模式打开JSON文件
with open('data.json', 'r', encoding='utf-8') as file:
# 使用json的load方法从文件读取数据
loaded_data = json.load(file)
print(f"从 data.json 反序列化的数据: {loaded_data}")
except (IOError, json.JSONDecodeError) as e:
print(f"反序列化失败: {e}")
# 3. 使用 marshal 库进行序列化和反序列化
import marshal
# 要序列化的数据
data = {'name': 'Charlie', 'age': 35}
try:
# 以二进制写入模式打开文件
with open('data.marshal', 'wb') as file:
# 使用marshal的dump方法将数据写入文件
marshal.dump(data, file)
print("数据已序列化到 data.marshal")
except IOError as e:
print(f"序列化失败: {e}")
# 反序列化对象从文件
try:
# 以二进制读取模式打开文件
with open('data.marshal', 'rb') as file:
# 使用marshal的load方法从文件读取数据
loaded_data = marshal.load(file)
print(f"从 data.marshal 反序列化的数据: {loaded_data}")
except (IOError, marshal.MarshalError) as e:
print(f"反序列化失败: {e}")
# 4. 使用 shelve 库进行序列化和反序列化
import shelve
try:
# 打开一个shelve数据库文件
with shelve.open('data_shelve.db') as db:
# 将数据存储到数据库中
db['user'] = {'name': 'David', 'age': 40, 'city': 'San Francisco'}
print("数据已序列化到 data_shelve.db")
except IOError as e:
print(f"序列化失败: {e}")
# 反序列化对象从 shelve 文件
try:
with shelve.open('data_shelve.db') as db:
# 从数据库中读取数据
loaded_data = db['user']
print(f"从 data_shelve.db 反序列化的数据: {loaded_data}")
except (KeyError, IOError) as e:
print(f"反序列化失败: {e}")
讲解内容
在以上代码中,我们展示了如何使用Python中的不同库进行对象的序列化和反序列化。通过使用pickle库,我们可以方便地将Python对象保存到文件中,并在需要时重新加载。使用json库,我们能够将数据转换为JSON格式,这种格式适合于网络传输和与其他编程语言的数据交互。
marshal库虽然速度较快,但不支持自定义对象,适合于基本数据类型。而shelve库则提供了一种字典式的方式来存储Python对象,方便我们进行持久化存储。
每种序列化方式都有其适用场景,理解它们的特点能够帮助我们在实际项目中做出合适的选择。