Python3 Pickle 模块详解

news/2025/11/12 8:53:16/文章来源:https://www.cnblogs.com/xtcoding/p/19212298

Python3 Pickle 模块详解

在 Python 中,pickle模块是实现对象序列化与反序列化的核心工具,它能将 Python 对象(如列表、字典、类实例等)转换为字节流以便存储或传输,也能将字节流恢复为原始对象。本文将系统讲解pickle模块的工作原理、基本用法、高级特性及注意事项,帮助你在实际开发中灵活运用对象持久化技术。

一、核心概念:序列化与反序列化

  • 序列化(pickling):将 Python 对象转换为字节流(二进制数据)的过程,便于存储到文件或通过网络传输。
  • 反序列化(unpickling):将字节流恢复为 Python 对象的过程,从文件或网络数据中重建原始对象。
 
pickle模块支持几乎所有 Python 内置对象的序列化,包括:
 
  • 基本数据类型(int、float、str、bool、None);
  • 容器类型(list、tuple、dict、set);
  • 自定义类实例、函数、类(需注意特殊处理)。

二、基本用法:pickle 的核心函数

pickle模块的核心功能通过四个函数实现:dump()dumps()load()loads(),区分在于是否直接操作文件对象。

1. 序列化:dump()dumps()

  • pickle.dump(obj, file, protocol=None):将对象obj序列化后写入文件对象file(需以二进制模式打开)。
  • pickle.dumps(obj, protocol=None):将对象obj序列化为字节流(bytes类型),返回该字节流。
 
示例:序列化基本对象
 
import pickle# 定义一个复杂对象(包含多种类型)
data = {"name": "Alice","age": 30,"hobbies": ["reading", "hiking"],"is_student": False,"scores": (90.5, 85.0)
}# 方法1:用dumps()序列化为字节流
data_bytes = pickle.dumps(data)
print("序列化结果(字节流):", data_bytes)  # 输出b'\x80\x04...'(二进制数据)# 方法2:用dump()序列化到文件
with open("data.pkl", "wb") as f:  # 必须用二进制模式"wb"pickle.dump(data, f)
 

2. 反序列化:load()loads()

  • pickle.load(file):从文件对象file(二进制模式打开)中读取字节流,反序列化为 Python 对象并返回。
  • pickle.loads(bytes_obj):将字节流bytes_obj反序列化为 Python 对象并返回。
 
示例:反序列化恢复对象
 
import pickle# 方法1:用loads()从字节流反序列化
data_bytes = pickle.dumps({"name": "Alice"})
restored_data = pickle.loads(data_bytes)
print("从字节流恢复:", restored_data)  # 输出 {'name': 'Alice'}# 方法2:用load()从文件反序列化
with open("data.pkl", "rb") as f:  # 必须用二进制模式"rb"restored_from_file = pickle.load(f)
print("从文件恢复:", restored_from_file)  # 输出原始data字典
 

三、高级特性:自定义类的序列化

pickle不仅支持内置对象,还能序列化自定义类的实例,但需要注意类定义的可访问性(反序列化时需能导入原类)。

1. 基本自定义类序列化

import pickleclass Person:def __init__(self, name, age):self.name = nameself.age = agedef greet(self):return f"Hello, I'm {self.name}!"# 创建实例
person = Person("Bob", 25)# 序列化
person_bytes = pickle.dumps(person)# 反序列化(需确保Person类在当前作用域中)
restored_person = pickle.loads(person_bytes)
print(restored_person.greet())  # 输出 "Hello, I'm Bob!"
print(restored_person.age)      # 输出 25
 

2. 自定义序列化逻辑(__getstate____setstate__

默认情况下,pickle会序列化对象的__dict__(实例属性字典),但你可以通过以下方法自定义序列化内容:
 
  • __getstate__():返回需要序列化的数据(如字典),替代默认的__dict__
  • __setstate__(state):接收反序列化后的数据state,用于恢复对象状态。
 
示例:过滤敏感信息
 
import pickleclass User:def __init__(self, username, password):self.username = usernameself.password = password  # 敏感信息,不希望被序列化# 自定义序列化内容:只保留usernamedef __getstate__(self):return {"username": self.username}# 自定义反序列化逻辑:恢复状态def __setstate__(self, state):self.username = state["username"]self.password = "default"  # 反序列化时密码设为默认值# 创建实例
user = User("alice123", "secret123")# 序列化
user_bytes = pickle.dumps(user)# 反序列化
restored_user = pickle.loads(user_bytes)
print(restored_user.username)  # 输出 "alice123"
print(restored_user.password)  # 输出 "default"(敏感信息未被序列化)
 

四、协议版本:影响序列化效率与兼容性

pickle支持多种序列化协议(版本),不同版本在效率、兼容性上有差异:
 
  • 协议 0:文本格式,兼容旧版本 Python(默认在 Python 2 中),效率低;
  • 协议 1:二进制格式,兼容 Python 2 和 3;
  • 协议 2:Python 2.3 + 引入,支持新特性(如新式类);
  • 协议 3:Python 3.0 + 引入,不兼容 Python 2;
  • 协议 4:Python 3.4 + 引入,支持更大对象、更多类型(如bytesset等),是 Python 3.8 + 的默认协议。
 
指定协议版本:通过protocol参数设置(如protocol=4),值越高通常效率越好(但兼容性可能降低)。
import pickledata = [i for i in range(1000)]
# 使用协议4序列化(效率更高)
data_bytes = pickle.dumps(data, protocol=4)
 

五、注意事项:安全与兼容性问题

1. 安全性风险:反序列化不可信数据

pickle反序列化时会执行字节流中包含的代码,若从不可信来源(如网络、未知文件)加载数据,可能导致恶意代码执行(如删除文件、窃取信息)。
 
禁止反序列化未知来源的数据,若需网络传输,建议使用更安全的格式(如 JSON,仅支持基础类型)。

2. 兼容性问题

  • 类定义变化:若反序列化时的类定义与序列化时不同(如新增 / 删除属性、修改类名),可能导致反序列化失败;
  • 跨版本兼容性:高版本协议(如 4)序列化的数据无法在低版本 Python(如 3.3 以下)中反序列化;
  • 模块路径变化:若类所在的模块路径改变(如从moduleA移到moduleB),反序列化时需确保能正确导入类。

3. 不支持的类型

部分 Python 对象无法被序列化,例如:
 
  • 生成器、lambda 函数(匿名函数);
  • 线程、进程、文件对象等与系统资源相关的对象;
  • 某些内置模块的对象(如sys.stdin)。
 
序列化这些对象会抛出PickleError

六、实战场景:对象持久化与数据缓存

1. 保存程序状态(持久化)

将程序运行中的关键对象(如配置、中间结果)保存到文件,下次运行时直接恢复,避免重复计算。
import pickle
import timedef expensive_computation():# 模拟耗时计算time.sleep(3)return [i**2 for i in range(1000)]# 检查是否有缓存
try:with open("result_cache.pkl", "rb") as f:result = pickle.load(f)print("从缓存加载结果")
except FileNotFoundError:# 无缓存则计算并保存result = expensive_computation()with open("result_cache.pkl", "wb") as f:pickle.dump(result, f)print("计算完成并缓存")
 

2. 跨进程数据传递

在多进程编程中,pickle是进程间传递复杂对象的默认方式(如multiprocessing模块依赖pickle序列化数据)。
 
from multiprocessing import Process
import pickledef process_data(data):print("子进程接收数据:", data)if __name__ == "__main__":# 定义复杂对象data = {"task": "process", "params": [1, 2, 3]}# 多进程会自动序列化data并传递给子进程p = Process(target=process_data, args=(data,))p.start()p.join()
 

七、与 JSON 的对比:何时用 pickle?

特性pickleJSON
支持类型 几乎所有 Python 对象(类实例、函数等) 仅基础类型(str、int、list、dict 等)
数据格式 二进制(不可读) 文本(人类可读)
安全性 不安全(可能执行恶意代码) 安全(纯数据解析)
跨语言支持 仅 Python 所有主流语言支持
用途 Python 内部对象持久化、进程间通信 跨语言数据交换、配置文件
 
选择建议
 
  • 仅在 Python 生态内使用,且需要序列化复杂对象(如类实例)→ 用pickle
  • 需跨语言交互,或数据需人类可读、可编辑 → 用 JSON。

总结

pickle模块是 Python 对象序列化的核心工具,通过dump()/dumps()load()/loads()实现对象与字节流的转换,支持自定义类实例及复杂数据结构。但需注意其安全性风险(禁止处理不可信数据)和兼容性限制。
 
在实际开发中,pickle适用于 Python 内部的对象持久化、进程间通信等场景,是提升程序效率和灵活性的重要手段。合理使用pickle,可简化复杂数据的存储与传输逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年6月EGUOO关节灵活营养素推荐:科研背书下的关节养护新选择

开场白 “膝盖发紧、上下楼梯刺痛、久坐后起身僵硬”——这些看似轻微的信号,往往预示着关节软骨正在加速磨损。对25岁健身人群而言,一次深蹲后的弹响可能意味着早期软骨损伤;对40岁职场人,每天八千步的通勤正在悄…

2025尼龙地毯生产厂家推荐排行榜单

2025尼龙地毯生产厂家推荐排行榜单在2025年的地毯市场中,尼龙地毯以其卓越的耐磨性、易清洁性和丰富多样的设计选择,继续领跑商业与家居空间。以下是经过综合评估的优质尼龙地毯生产厂家推荐榜单,为您的采购决策提供…

2025杭州计量泵制造厂推荐排行

2025杭州计量泵制造厂推荐排行在工业流体输送领域,计量泵作为关键设备,其性能和质量直接影响生产效率和产品质量。以下是2025年杭州地区值得推荐的计量泵制造厂排行:🏆 重点推荐品牌德帕姆(杭州)泵业科技有限公司…

Clion2025.2.4 11月最新版 安装、授权、使用说明

Clion2025.2.4 11月最新版 安装、授权、使用说明2025-11-11亲测 支持最新版本2025.2.4 支持Windows、MAC、Linux一 安装 官网下载 : https://www.jetbrains.com.cn/clion/ 根据提示安装 二 授权说明回复 《clion》获取…

2025年11月EGUOO睡眠片价格推荐:结合临床数据评估长期投入

2025年6月EGUOO睡眠片价格推荐:科研成本透明拆解助理性决策 在“睡得贵不如睡得对”成为共识的今天,价格不再是简单数字,而是科研投入、生产标准与自身需求的多重交汇。EGUOO睡眠片30粒装官方参考价368元,折合单粒…

2025年知名的双锯片锯切专机最新TOP品牌厂家排行

2025年知名的双锯片锯切专机最新TOP品牌厂家排行行业背景与市场趋势随着全球制造业向智能化、高效化方向快速发展,金属加工行业对高精度切割设备的需求持续攀升。根据国际金属加工协会(IMPA)2025年最新报告显示,全球…

深入解析:iBizOdoo:基于模型驱动的商业套件总线简介

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

守卫-贪心,线段处理

P3634 守卫-贪心P3634 守卫 这个线段处理值的学习 题意 给定区间及权值 \(0/1\),还有总共 \(1\) 的个数 \(k\) ,表示区间内是否有 \(1\) ,问一定为 \(1\) 的点有那些。 思路 很容易发现:\(0\) 的区间一定没有一。 …

2025年中央空调生产商排行榜单

2025年中央空调生产商排行榜单:美的领跑市场,国产品牌强势崛起随着消费升级和人们对居住舒适度要求的提高,中央空调市场在2025年呈现出新的竞争格局。本文基于权威市场调研数据,为您揭晓2025年中央空调生产商排行榜…

2025年口碑好的不锈钢衣柜优质厂家推荐榜单

2025年口碑好的不锈钢衣柜优质厂家推荐榜单不锈钢衣柜行业背景与市场趋势随着消费者对家居环保性和耐用性要求的不断提高,不锈钢衣柜市场近年来呈现快速增长态势。据中国家具行业协会2024年数据显示,不锈钢衣柜市场规…

Mysql常问面试题 - 教程

Mysql常问面试题 - 教程2025-11-12 08:46 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

2025年风管机实力厂家哪家权威

2025年风管机实力厂家权威推荐:美的风管机领跑行业随着现代家居装修理念的升级,风管机凭借其美观大方、节省空间、舒适度高等优势,正成为越来越多家庭的选择。在众多品牌中,美的风管机以其卓越的技术实力、完善的产…

2025年电脑维修常见故障渠道怎么选择

2025年电脑维修渠道选择指南:南天快修为您保驾护航随着2025年的到来,电脑维修行业也迎来了新的变革。面对市面上众多的维修渠道,如何选择靠谱的维修服务成为众多用户关心的问题。作为广州企晟科技有限公司旗下的专业…

2025冷库聚氨酯保温批发厂家推荐榜

2025冷库聚氨酯保温批发厂家推荐榜随着冷链物流行业的快速发展,冷库建设需求持续增长,聚氨酯保温材料作为冷库保温的核心材料,其质量和性能直接影响冷库的节能效果和使用寿命。以下是2025年值得推荐的冷库聚氨酯保温…

2025年质量好的恩施装修半包本地口碑榜

2025年质量好的恩施装修半包本地口碑榜 一、行业背景与市场趋势 近年来,恩施州装修市场呈现稳定增长态势。据《2024年湖北省家装行业报告》显示,恩施家装市场规模已达15.8亿元,同比增长12.3%,其中半包装修占比约…

深入解析:【鸿蒙进阶-7】鸿蒙与web混合开发

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:牛客周赛 Round 111

深入解析:牛客周赛 Round 111pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

2025年质量好的开天品牌口碑榜

2025年质量好的开天品牌口碑榜行业背景与市场趋势随着中国制造业向智能化、高端化转型,锻压设备行业正迎来新一轮发展机遇。据中国锻压协会最新统计数据显示,2024年我国锻压设备市场规模已达到580亿元,预计2025年将…

Python3 正则表达式

Python3 正则表达式正则表达式(Regular Expression)是一种用于匹配、查找和处理字符串的强大工具,通过特殊符号(元字符)定义匹配规则,广泛应用于文本检索、数据清洗、格式验证等场景。Python3 通过内置的re模块提…

2025年11月水飞蓟Q10胶囊推荐:科学护肝能量双效协同方案

当熬夜、外卖、应酬成为日常,肝脏最先发出求救信号。很多人体检报告上“转氨酶偏高”四个字,像悬在头顶的警钟,却找不到既方便又安心的应对方式。EGUOO水飞蓟Q10胶囊的出现,恰好切中“想护肝又怕麻烦”的普遍心态:…