Python Pickle 模块
Python3 学习笔记 · 整理自菜鸟教程
一句话
pickle 把 Python 对象序列化成字节流(可存文件、可传输),也能从字节流反序列化还原成原对象。
要点
- 四个核心函数:
dumps/loads在内存里转字节,dump/load对应文件读写。 - 能序列化绝大多数内置类型、嵌套结构、以及自定义类的实例。
- 文件必须用二进制模式:写用
'wb',读用'rb'。 protocol指定协议版本,pickle.HIGHEST_PROTOCOL是当前最高版本,越小兼容性越好。- 安全警告:
pickle反序列化会执行任意代码,绝不能加载不可信数据。 - 不能序列化:
lambda、打开的文件对象、socket、线程锁等(会抛PicklingError/TypeError)。 - 自定义类可通过
__getstate__/__setstate__控制存取哪些状态。 copy.deepcopy底层就是用pickle思路复制对象。- 跨语言交互不建议用
pickle,改用json/msgpack。
语法 / 常用方法
| 语法/方法 | 说明 | 示例 |
|---|---|---|
pickle.dumps(obj) |
对象 → 字节串 | b = pickle.dumps(d) |
pickle.loads(data) |
字节串 → 对象 | d = pickle.loads(b) |
pickle.dump(obj, f) |
写入二进制文件 | pickle.dump(d, f) |
pickle.load(f) |
从二进制文件读回 | d = pickle.load(f) |
pickle.HIGHEST_PROTOCOL |
最高协议版本 | dumps(d, HIGHEST_PROTOCOL) |
pickle.DEFAULT_PROTOCOL |
默认协议版本 | 3.8+ 为 4 |
protocol=0 |
ASCII 文本协议,可读 | 调试时用 |
obj.__getstate__() |
自定义要保存的状态 | 返回可序列化对象 |
obj.__setstate__(s) |
自定义还原状态 | 配合 __getstate__ |
代码示例
1 | |
易错点
- 只信自己的数据:
pickle.load一个恶意文件等于执行对方写的代码,公网/用户上传的数据绝不 pickle。 - 忘记二进制模式:
open('x.pkl', 'w')会报TypeError: a bytes-like object is required。 - 协议版本不一致:高版本存、低版本 Python 读会失败,跨环境固定协议或降级。
lambda和内部函数无法 pickle,要序列化就得改成模块级具名函数。- 自定义类依赖类的定义:读 pickle 时如果类改名/删字段,会反序列化失败或丢数据。
- 存储格式不跨语言,别拿它当通用交换格式,和别的语言通信选
json。