pickle是Python内置序列化模块,用于对象与字节流互转,适用于Python内部数据持久化;使用时需注意版本兼容性、禁止反序列化不可信数据,并可通过__getstate__/__setstate__定制类的序列化行为。

pickle 是 Python 内置的序列化模块,用于将 Python 对象转换为字节流(序列化),或从字节流还原为对象(反序列化)。它适合在 Python 环境内部做数据持久化,比如缓存中间结果、保存模型状态、临时存储配置等。
什么时候该用 pickle
当你需要把 Python 对象(如 dict、list、class 实例、函数)原样保存到文件或内存,并且只在 Python 程序中读取时,pickle 是最直接的选择。它支持几乎所有内置类型和自定义类(只要满足一定条件)。
- 对象结构复杂,含嵌套、引用、方法绑定等
- 不跨语言,不对外提供接口
- 追求简洁、无需手动定义 schema
- 对安全性有可控环境(不加载不可信数据)
基本用法:保存与加载
使用 pickle.dump() 和 pickle.load() 进行文件级持久化:
<font color="#888"># 保存对象到文件
import pickle
data = {'name': 'Alice', 'scores': [85, 92, 78]}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
<h1>从文件读取对象</h1><p>with open('data.pkl', 'rb') as f:
loaded = pickle.load(f)
print(loaded) # {'name': 'Alice', 'scores': [85, 92, 78]}</font>若需暂存在内存中(如缓存、网络传输),可用 pickle.dumps() 和 pickle.loads():
95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we
立即学习“Python免费学习笔记(深入)”;
<font color="#888">byte_data = pickle.dumps(data) restored = pickle.loads(byte_data)</font>
注意版本兼容性与安全风险
pickle 协议版本随 Python 升级而变化,默认使用最新版(如 Python 3.8+ 默认 protocol=4)。老版本 Python 可能无法读取高版本生成的 pickle 数据。建议显式指定协议以增强兼容性:
<font color="#888"># 使用 protocol=4(Python 3.4+ 支持),兼顾功能与兼容性 pickle.dump(obj, f, protocol=4)</font>
切勿反序列化不可信来源的数据 —— pickle 在加载时会执行任意代码(如类的 __reduce__ 方法),可能触发远程代码执行漏洞。生产环境中,若需接收外部序列化数据,应改用 JSON、msgpack 或自定义安全解析器。
自定义类的 pickle 支持
大多数普通类可直接被 pickle,但若涉及文件句柄、线程锁、数据库连接等无法序列化的属性,需重写 __getstate__ 和 __setstate__ 方法来控制保存/恢复逻辑:
<font color="#888">class Model:
def __init__(self, name):
self.name = name
self._cache = {} # 不想保存的临时数据
self._file_handle = None # 不能 pickle 的资源
<pre class='brush:python;toolbar:false;'>def __getstate__(self):
state = self.__dict__.copy()
# 排除不可序列化的字段
state.pop('_file_handle', None)
state.pop('_cache', None)
return state
def __setstate__(self, state):
self.__dict__.update(state)
# 恢复时重新初始化非持久字段
self._cache = {}
self._file_handle = None</font>









