【Python】pickle序列化模块

pickle是什么

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

与json的比较

方面picklejson
类型支持支持序列化几乎所有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)更耗费资源。在考虑性能和效率时,需要根据具体的使用场景进行评估和测试。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al6n Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值