您现在的位置是:网站首页 > 博客日记 >

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 方法将对象序列化为字节流,然后手动处理这些不能序列化的部分。

注意事项

  1. pickle 模块不是跨语言的,它只能用于 Python 对象。
  2. 序列化的对象必须在反序列化时可用,即所有对象的类都必须在 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