python对象序列化|pickle
作者:YXN-python 阅读量:11 发布日期:2024-11-15
python 的 pickle 模块是一个用于序列化和反序列化 Python 对象结构的模块。它能够将对象转换成一个字节流(pickle 序列),以便可以将其存储在文件中或通过网络传输,之后可以恢复成原始对象。
基础用法
# 要序列化的对象
data = {
'a': [1, 2.5, 3, 4+4j],
'b': ("string", b'byte string'),
'c': {None, True, False}
}
# 序列化(保存对象到文件)
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)
# 反序列化(从文件加载对象)
with open('data.pickle', 'rb') as f:
data = pickle.load(f)
print(data)
高级选项
使用不同的协议
pickle 模块提供了几种不同的协议,用于优化序列化的性能和兼容性:
- protocol=0:Python 2.x 协议
- protocol=1:二进制协议
- protocol=2:提供了更高效的序列化方式,仅在 Python 3.4 及以上版本中可用
- protocol=3:提供了更高效的序列化方式,仅在 Python 3.8 及以上版本中可用
- protocol=4 或 protocol=HIGHEST_PROTOCOL:使用最高可用协议
示例:
with open('data.pickle', 'wb') as f:
pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
处理不能序列化的对象
有些对象不能被 pickle 序列化,比如文件对象、数据库连接等。对于这些对象,可以使用 pickle 的 dumps 方法将对象序列化为字节流,然后手动处理这些不能序列化的部分。
注意事项
- pickle 模块不是跨语言的,它只能用于 Python 对象。
- 序列化的对象必须在反序列化时可用,即所有对象的类都必须在 Python 的模块搜索路径中。如下实例中在反序列化的时候如果模块搜索路径中没有 a 函数则会报错,而且无法继续读取后面的对象
将多个对象序列化成一个字节流
# 要序列化的对象
data1 = {"a": {"b": [{"c": ["ABC", 10]}, {"c": ["987654"]}]}, "1": "hello"}
data2 = {'key2': 'value2'}
def a():
print('a')
data3 = a
# 将多个对象序列化成一个字节流
serialized_data = pickle.dumps(data1) + pickle.dumps(data2) + pickle.dumps(data3)
# 将字节流写入文件
with open('data.pickle', 'wb') as f:
f.write(serialized_data)
保存索引
通常来讲我们最好保存对象索引,可以把对象放在列表或字典中,方便我们读取的时候可以获取到更多信息
import pickle
data1 = {'key1': 'value1'}
data2 = {'key2': 'value2'}
data_list = [data1, data2]
# 序列化
with open('data.pkl', 'wb') as f:
pickle.dump(data_list, f)
# 读取
with open('data.pkl', 'rb') as f:
data_list = pickle.load(f)
num_objects = len(data_list)
print(f"对象数: {num_objects}")
YXN-python
2024-11-15