必须用'wb'模式,因为pickle序列化结果是bytes字节流,而文本模式'w'只接受str类型,类型不匹配会触发typeerror;'wb'绕过编码层,原样写入二进制数据。

直接用 pickle.dump() 就能保存,但必须注意文件要以 'wb' 模式打开——用 'w' 或 'r' 会报 TypeError: write() argument must be str, not bytes。
为什么必须用 'wb' 而不是 'w'
Pickle 序列化结果是字节流(bytes),不是字符串。文本模式('w')强制要求写入 str,而 pickle.dump() 输出的是 bytes,两者类型不匹配就会崩溃。
- 错误写法:
open('data.pkl', 'w')→ 触发TypeError - 正确写法:
open('data.pkl', 'wb') - 如果用
pathlib.Path,对应是.write_bytes(pickle.dumps(obj)),而非.write_text()
pickle.dump() 和 pickle.dumps() 怎么选
dump() 直接写入文件对象,适合保存到磁盘;dumps() 返回字节串,适合网络传输、缓存或进一步处理。
- 存文件:用
pickle.dump(obj, file_handle),配合with open(..., 'wb') as f: - 转字节:用
data_bytes = pickle.dumps(obj),之后可传给requests.post()或存入 Redis - 注意:
dumps()不涉及文件 IO,不会自动处理编码或换行,也无需关心打开模式
常见反序列化失败原因
加载时出错,90% 是因为保存和加载用了不一致的协议版本或 Python 环境。
- 默认协议随 Python 版本升级(如 Python 3.8 默认用 protocol 4,3.12 默认用 5),旧版本 Python 可能无法读取新协议生成的文件
- 跨环境加载时,确保类定义在加载端已导入——否则会报
AttributeError: Can't get attribute 'MyClass' on <module></module> - 避免用
lambda、嵌套函数或局部类,它们无法被 pickle 安全序列化 - 读取文件必须用
'rb'模式,用'r'会解码失败,报UnicodeDecodeError或UnpicklingError
最易被忽略的一点:Pickle 文件不具备跨语言兼容性,也不是安全的输入源——永远不要 unpickle 来自不可信来源的数据,它可能执行任意代码。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











