Python入门:Python3 Pickle模块全面学习教程

Python入门:Python3 Pickle模块全面学习教程


在这里插入图片描述

Python入门:Python3 Pickle模块全面学习教程

Python入门:Python3 Pickle模块全面学习教程,本文详细介绍 Python Pickle 模块的核心知识与应用。Pickle 是 Python 标准库中用于对象序列化与反序列化的工具,可将列表、字典、类实例等对象转为字节流实现持久化存储或网络传输,再将字节流还原为原对象。文中先讲解其核心方法,包括用于文件操作的dump()与load()、用于字节串操作的dumps()与loads(),并结合实例展示文件存储和字节串传输两种场景的使用。还介绍自定义对象序列化的实现方式,通过__getstate__()和__setstate__()方法自定义逻辑。同时阐述 Pickle 协议版本的差异与选择,强调安全性、兼容性、性能方面的注意事项,对比 Pickle 与 JSON 的适用场景,助力开发者根据需求正确使用 Pickle 模块提升数据处理效率。
在这里插入图片描述

前言

    Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。

在这里插入图片描述

在这里插入图片描述

🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。

🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。

🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。

🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。

🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。


Python入门:Python3 Pickle模块全面学习教程

🌐 前篇文章咱们练习了 Python3 sys模块全面学习教程 ,如果忘记了,可以去重温一下,不停的重复敲击基础代码,有助于让你更加熟练掌握一门语言。今天咱们继续学习 ,Python3 Pickle模块全面学习教程,下面开始吧!

在Python开发中,我们经常需要将数据结构或对象保存到文件、通过网络传输,或者在程序重启后恢复之前的状态。这时候,序列化与反序列化就成了关键技术。而Python标准库中的pickle模块,正是专门用于处理Python对象序列化的工具。本文将从基础概念出发,逐步讲解pickle模块的用法、注意事项和高级技巧,帮助你轻松掌握这一实用工具。

一、什么是Pickle模块?

pickle是Python内置的标准库模块,核心功能是实现Python对象的序列化与反序列化

  • 序列化(Serialization):将Python对象(如列表、字典、类实例等)转换为字节流的过程,便于存储或传输。
  • 反序列化(Deserialization):将序列化生成的字节流转换回原始Python对象的过程,实现数据的恢复。

简单来说,pickle就像一个“打包机”,能把复杂的Python对象“压缩”成字节流,也能把字节流“解压”回原本的对象,支持几乎所有Python原生数据类型和自定义类实例。

二、为什么要用Pickle?

在实际开发中,pickle的应用场景非常广泛,核心优势体现在以下三点:

1. 数据持久化

将Python对象直接保存到文件中,程序关闭后再次运行时,无需重新构造数据,直接加载即可恢复状态。例如:

  • 保存训练好的机器学习模型(如Scikit-learn模型)
  • 存储程序的配置信息或用户数据

2. 跨进程/网络数据传输

在分布式系统、多进程编程中,pickle可以将对象序列化为字节流,通过网络或进程间通信(IPC)传递,接收方再反序列化为对象。例如:

  • 多进程任务中传递复杂数据结构(如列表、字典)
  • 客户端与服务器之间传递自定义类实例

3. 高效处理复杂结构

相比json(仅支持基础数据类型),pickle能直接处理Python特有的复杂对象(如类实例、函数、集合),无需手动转换格式,简化开发流程。

三、Pickle基础用法:序列化与反序列化

pickle的核心操作只有两个:序列化到文件/字节串从文件/字节串反序列化。下面通过实例详细讲解。

3.1 核心方法速览

在开始前,先熟悉pickle的4个核心方法,后续所有操作都基于这些方法:

方法功能适用场景
pickle.dump(obj, file)将对象obj序列化并写入文件file保存对象到本地文件
pickle.load(file)从文件file读取字节流,反序列化为对象从本地文件加载对象
pickle.dumps(obj)将对象obj序列化为字节串(内存中)网络传输、进程间通信
pickle.loads(bytes_data)将字节串bytes_data反序列化为对象接收网络/进程传递的字节流

3.2 场景1:序列化到文件 & 从文件加载

这是最常用的场景,适用于“保存数据到本地,下次运行时恢复”。

步骤1:序列化对象到文件

使用pickle.dump(),注意文件必须以二进制写模式(wb 打开。

import pickle # 1. 定义一个复杂的Python对象(字典嵌套列表) user_data ={"name":"Alice","age":25,"hobbies":["reading","traveling","coding"],"is_student":False}# 2. 序列化并保存到文件(文件名为 data.pkl,后缀.pkl是约定俗成的)withopen("user_data.pkl","wb")as f: pickle.dump(user_data, f)# 将user_data序列化并写入文件print("对象已保存到 user_data.pkl")

运行后,当前目录会生成user_data.pkl文件,该文件是二进制格式,无法直接用文本编辑器打开(打开会显示乱码)。

在这里插入图片描述
步骤2:从文件反序列化加载对象

使用pickle.load(),文件必须以二进制读模式(rb 打开。

import pickle # 从文件加载并反序列化对象withopen("user_data.pkl","rb")as f: loaded_data = pickle.load(f)# 读取字节流,转换为Python对象# 验证结果:加载的对象与原对象完全一致print("加载的对象:", loaded_data)print("类型:",type(loaded_data))# <class 'dict'>print("姓名:", loaded_data["name"])# Aliceprint("爱好:", loaded_data["hobbies"])# ['reading', 'traveling', 'coding']

运行结果会输出原对象的所有内容,证明反序列化成功。

3.3 场景2:序列化到字节串 & 从字节串加载

适用于“内存中临时存储”或“网络/进程间传输”,无需生成本地文件。

import pickle # 1. 定义一个Python对象(列表) numbers =[1,2,3,4,5,(6,7)]# 包含元组的列表# 2. 序列化到字节串(内存中,无文件) bytes_data = pickle.dumps(numbers)print("序列化后的字节串:", bytes_data)# b'\x80\x04\x95\x13\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04K\x05\x87\x94(K\x06K\x07\x94e.'# 3. 从字节串反序列化 restored_numbers = pickle.loads(bytes_data)print("反序列化后的对象:", restored_numbers)# [1, 2, 3, 4, 5, (6, 7)]print("是否与原对象一致:", restored_numbers == numbers)# True

字节串bytes_data可以直接通过socket(网络)或multiprocessing(多进程)传递,接收方调用pickle.loads()即可恢复对象。

四、高级用法:自定义对象的序列化

pickle默认支持自定义类实例的序列化,但有时我们需要自定义序列化逻辑(比如过滤敏感属性、简化对象存储)。这时候可以通过实现两个特殊方法:__getstate__()__setstate__()

4.1 原理说明

  • __getstate__():序列化时自动调用,返回一个“状态字典”,该字典会被pickle保存(仅保存字典中的属性)。
  • __setstate__():反序列化时自动调用,接收序列化保存的“状态字典”,用于恢复对象的属性。

4.2 实战案例:过滤敏感属性

假设我们有一个User类,包含敏感属性password,序列化时不想保存该属性,反序列化时也无需恢复。

import pickle classUser:def__init__(self, username, password, email): self.username = username # 需保存的属性 self.password = password # 敏感属性,不保存 self.email = email # 需保存的属性# 自定义序列化逻辑:只保存username和emaildef__getstate__(self):# 返回要保存的属性字典(排除password)return{"username": self.username,"email": self.email }# 自定义反序列化逻辑:从状态字典恢复属性def__setstate__(self, state):# state是__getstate__()返回的字典 self.username = state["username"] self.email = state["email"]# 反序列化时不给password赋值(或设为默认值) self.password =None# 1. 创建对象并序列化 user = User("bob123","abc123456","[email protected]")withopen("user.pkl","wb")as f: pickle.dump(user, f)# 2. 反序列化withopen("user.pkl","rb")as f: loaded_user = pickle.load(f)# 验证结果print("用户名:", loaded_user.username)# bob123print("邮箱:", loaded_user.email)# [email protected]("密码:", loaded_user.password)# None(敏感属性未保存)

通过__getstate__()__setstate__(),我们成功过滤了敏感属性,保证数据安全。

五、Pickle协议版本:影响兼容性与性能

pickle序列化时会使用“协议版本”,不同版本支持的Python版本、性能和功能不同。选择合适的协议版本,能平衡兼容性性能

5.1 协议版本说明

协议版本支持Python版本特点适用场景
0所有Python版本ASCII格式,可读性强,速度慢兼容极旧版本Python(几乎不用)
1所有Python版本二进制格式,比0快兼容旧版本Python(少用)
2Python 2.3+优化类对象序列化,支持新型类Python 2与3兼容(少用)
3Python 3.0+不支持Python 2,修复部分bug仅Python 3环境(基础选择)
4Python 3.4+支持更大对象(>4GB)、更多数据类型主流选择,兼顾性能与兼容性
5Python 3.8+支持内存优化、数据共享,速度更快高版本Python(推荐)

5.2 如何指定协议版本

通过pickle.dump()pickle.dumps()protocol参数指定,推荐使用以下两种方式:

  • protocol=pickle.HIGHEST_PROTOCOL:自动使用当前Python支持的最高版本(性能最优)
  • protocol=pickle.DEFAULT_PROTOCOL:使用默认版本(通常为4,兼容性较好)
示例:指定最高协议版本
import pickle data ={"key":"value","list":[1,2,3]}# 用最高协议版本序列化(性能最优)withopen("data_high.pkl","wb")as f: pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)# 查看当前Python的默认协议和最高协议print("默认协议版本:", pickle.DEFAULT_PROTOCOL)# 通常为4print("最高协议版本:", pickle.HIGHEST_PROTOCOL)# 如Python 3.10为5

六、必须注意的3个问题

pickle虽然强大,但存在一些风险和局限性,使用时必须注意以下几点,否则可能导致程序异常或安全问题。

6.1 安全性:绝对不要加载不可信的Pickle数据

最关键的风险pickle反序列化时会执行字节流中包含的任意Python代码。如果加载来自不可信来源(如网络下载、他人发送)的*.pkl文件,可能会被注入恶意代码(如删除文件、窃取数据)。

错误示例(危险!)
import pickle import requests # 危险操作:加载来自网络的不可信pickle数据 unsafe_data = requests.get("http://malicious.com/evil.pkl").content loaded_obj = pickle.loads(unsafe_data)# 可能执行恶意代码!
安全建议
  • 仅加载自己生成或可信来源的pickle数据。
  • 如果需要跨网络传输数据,优先使用更安全的格式(如jsonprotobuf),或对pickle数据进行加密和签名验证。

6.2 兼容性:Python版本与类定义必须一致

  • Python版本兼容:高版本Python生成的pickle数据(如协议5),无法在低版本Python(如3.7及以下)中加载;反之,低版本生成的数据通常可在高版本中加载。
  • 类定义一致:反序列化自定义类实例时,当前环境必须有该类的完整定义(包括类名、属性、方法),否则会报AttributeError
错误示例(类定义缺失)
# 环境1:定义User类并序列化import pickle classUser:def__init__(self, name): self.name = name pickle.dump(User("Alice"),open("user.pkl","wb"))# 环境2:未定义User类,直接反序列化(报错)import pickle loaded_user = pickle.load(open("user.pkl","rb"))# AttributeError: Can't get attribute 'User' on <module '__main__'>
兼容建议
  • 跨环境使用时,统一pickle协议版本(如使用协议4)。
  • 反序列化前,确保当前环境已导入对应的类定义。

6.3 性能:大型数据集可能较慢

pickle的性能在处理小型数据时表现良好,但对于GB级别的大型数据集(如海量日志、大矩阵),序列化/反序列化速度可能较慢,且占用较多内存。

优化建议
  • 大型数据集优先使用更高效的工具(如msgpacknumpy.savepandas.to_pickle(基于pickle优化))。
  • 分块处理:将大型数据拆分为多个小块,分别序列化/反序列化,减少内存占用。

七、Pickle vs JSON:该选哪个?

很多时候,picklejson都能实现数据存储/传输,两者的差异如下,需根据场景选择:

对比维度PickleJSON
支持的数据类型几乎所有Python对象(类实例、函数、集合等)仅基础类型(字典、列表、字符串、数字等)
跨语言兼容性仅支持Python(字节流是Python特有)跨语言(Java、Go、JavaScript等均支持)
安全性不安全(反序列化执行代码)安全(仅解析数据,不执行代码)
速度中小型数据较快,大型数据一般速度稳定,大型数据表现较好
可读性二进制格式,不可读文本格式,人类可直接阅读

选择建议

  • 仅Python环境、需处理复杂对象(如类实例):用pickle
  • 跨语言交互、需可读性、加载不可信数据:用json

八、总结

pickle是Python中处理对象序列化的核心工具,总结其核心要点:

  1. 核心功能:实现Python对象与字节流的相互转换,支持数据持久化和跨进程传输。
  2. 基础用法dump()/load()(文件操作)、dumps()/loads()(字节串操作)。
  3. 高级技巧:通过__getstate__()/__setstate__()自定义序列化逻辑。
  4. 关键注意:拒绝不可信数据、注意Python版本兼容、大型数据需优化。

掌握pickle的正确用法,能极大提升Python程序的数据处理效率,尤其是在机器学习、多进程编程等场景中,它会成为你的得力助手!

💡下一篇咱们学习 Python入门:Python3 subprocess模块全面学习教程!

附录:扩展学习资源

  1. 官方资源
  2. 本专栏特色资源
    • 代码资源仓库:ZEEKLOG专属资源在线获取
    • 海量Python教程:关注公众号:xcLeigh,获取网盘地址
    • 一对一答疑:添加微信与博主在线沟通(备注“Python专栏”

联系博主

    xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

    亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

     愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

    至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


     💞 关注博主 🌀 带你实现畅游前后端!

     🏰 大屏可视化 🌀 带你体验酷炫大屏!

     💯 神秘个人简介 🌀 带你体验不一样得介绍!

     🥇 从零到一学习Python 🌀 带你玩转Python技术流!

     🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

     💦 :本文撰写于ZEEKLOG平台,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

     📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

Read more

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型

Python中一切皆对象:深入理解Python的对象模型 * 什么是"一切皆对象"? * Python对象的类型层次 * 1. 内置类型对象 * 2. 函数对象 * 3. 类对象和实例对象 * 4. 模块对象 * 对象行为的统一性 * 特殊方法:对象行为的背后 * 对象模型的实际应用 * 性能考虑 * 总结 Python以其"一切皆对象"的设计哲学而闻名,这种设计为语言带来了极大的灵活性和一致性。本文将深入探讨Python的对象模型,解释为什么说"Python中一切皆对象",并通过实例展示这一特性如何影响我们的编程方式。 什么是"一切皆对象"? 在Python中,从简单的数字、字符串到复杂的函数、类甚至模块,所有这些都是对象。这意味着它们都有: 1. 身份(identity):对象在内存中的唯一地址,可通过id()函数获取 2.

By Ne0inhk

用 Python 批量下载全量 A 股历史行情数据:基于 AKShare 的高效实践

关键词:AKShare, A股数据, 股票历史行情, 量化分析, Python 金融, 断点续传 适用读者:量化交易初学者、金融数据分析师、Python 爱好者、学术研究者 💡 为什么需要本地化 A 股历史数据? 在量化投资、策略回测、因子挖掘等场景中,高质量、完整、本地存储的历史行情数据是不可或缺的基础。然而: * 商业数据接口(如 Wind、Tushare Pro)往往收费或有调用限制; * 免费接口(如早期 Tushare)可能不稳定或字段不全; * 网页爬虫易被反爬,维护成本高。 幸运的是,开源项目 AKShare 提供了免费、稳定、覆盖全面的中国金融市场数据接口,包括: * A 股日线、分钟线 * 指数、基金、期货、期权

By Ne0inhk

Python:__main__.py 文件详解

在 Python 项目开发中,__main__.py 是一个特殊的模块文件,它决定了当包或模块以入口程序运行时,Python 会执行什么代码。 理解 __main__.py 的作用,有助于我们构建可执行的 Python 包、组织项目结构,以及为代码提供统一的运行入口。 一、__main__.py 的作用 在两种情况下,Python 会执行 __main__.py 中的代码。 (1)以包运行 python -m package_name 比如,当你运行 python -m my_package 时,Python 会在 my_package 目录下查找并执行 __main__.py 文件。 (2)

By Ne0inhk

【强烈推荐】uv 安装多个 Python 版本与使用方法全攻略(替代 pyenv + venv + pip)

【强烈推荐】uv 安装多个 Python 版本与使用方法全攻略(替代 pyenv + venv + pip) 适用于:Ubuntu / Linux / macOS / Windows 本文环境:Ubuntu 20.04 Python 版本:3.8 ~ 3.13 一、uv 是什么?为什么要用 uv? uv 是 Astral(ruff 作者)推出的新一代 Python 工具,目标是 统一并替代 现有的 Python 工具链。 一句话总结: uv = pyenv + venv + pip 的高速合体版 uv 的核心优势

By Ne0inhk