【Python】pickle序列化模块

pickle是什么

是Python标准库中的一个模块,用于序列化(将对象转换为字节流)和反序列化(将字节流转换为对象)。pickle模块可以将几乎所有Python对象转换为字节流,并在需要时将其还原回原始对象。

与json的比较

方面 pickle json
类型支持 支持序列化几乎所有Python对象,包括自定义类和函数 仅支持基本数据类型(字符串、数字、布尔值)、列表、字典、null
跨语言兼容性 仅适用于Python,不适用于其他编程语言 通用的数据交换格式,与多种编程语言兼容
数据格式 二进制字节流,不可读性,只能由Python解析 文本格式,可读性强,多种编程语言都能解析
对象关联 可以序列化和反序列化复杂的对象层次结构,包括嵌套对象和循环引用 仅能表示简单的数据结构,不能直接表示对象之间的关联
安全性 不建议从不信任的来源加载pickle数据,可能存在安全风险 相对较安全,不会执行恶意代码
性能 在处理复杂对象和保留对象状态方面可能更高效 在处理简单数据结构方面通常更快、更高效

pickle的用法

序列化:将Python对象转化为字节流

import pickle

# 创建一个Python对象
data = {'name': 'John', 'age': 30, 'city': 'New York'}

# 将对象序列化为字节流
serialized_data = pickle.dumps(data)

print(serialized_data)  # b'\x80\x04\x95-\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x04John\x94\x8c\x03age\x94K\x1e\x8c\x04city\x94\x8c\x08New York\x94u.'

反序列化:将字节流转换回Python对象

import pickle

# 将字节流反序列化为Python对象
deserialized_data = pickle.loads(serialized_data)

# 访问反序列化后的对象
print(deserialized_data['name'])  # 输出: John
print(deserialized_data['age'])   # 输出: 30
print(deserialized_data['city'])  # 输出: New York

序列化到文件和从文件反序列化

import pickle

# 序列化到文件
with open('data.pkl', 'wb') as file:
    pickle.dump(data, file)

# 从文件反序列化
with open('data.pkl', 'rb') as file:
    deserialized_data = pickle.load(file)

注意事项

  1. 安全性风险:由于pickle的设计目标是在Python之间传递对象,加载不受信任的pickle数据可能存在安全风险。恶意的pickle数据可能包含恶意代码,因此请确保从可信任的来源加载pickle数据。
  2. 版本兼容性:pickle的数据格式与Python版本相关,因此请注意在不同Python版本之间的兼容性。序列化的对象可能无法在不同版本的Python中正确反序列化。在进行跨版本的数据交换时,建议在较低的Python版本中序列化,并在较高的Python版本中反序列化。
  3. 类和函数的变动:如果在序列化对象之后修改了类或函数的定义,反序列化时可能会出现错误。确保反序列化时使用与序列化时相同的类和函数定义,以避免出现不一致的情况。
  4. 跨语言兼容性:pickle生成的字节流是Python特定的,不适用于其他编程语言。如果需要与其他编程语言进行数据交互,应考虑使用通用的数据交换格式,如JSON。
  5. 性能和效率:尽管pickle可以处理复杂的对象层次结构和保留对象状态,但在某些情况下,它可能比其他序列化格式(如JSON)更耗费资源。在考虑性能和效率时,需要根据具体的使用场景进行评估和测试。

猜你喜欢

转载自blog.csdn.net/al6nlee/article/details/131488594