必须用二进制模式("wb")打开文件,因为pickle序列化结果是bytes流,文本模式会触发编码错误并抛typeerror。

直接用 pickle.dump() 写入文件,但必须用二进制模式("wb"),否则会报 TypeError: a bytes-like object is required, not 'str' —— 这是绝大多数人第一次踩的坑。
为什么不能用文本模式打开 pickle 文件
pickle 序列化结果是二进制数据,不是可读字符串。即使对象本身是纯数字或字典,序列化后也是带控制字节的 bytes 流。
- 用
open("data.pkl", "w")会触发编码尝试,默认用utf-8编码bytes→ 直接抛TypeError - 用
"rb"/"wb"才能绕过编码层,原样读写 - Windows 下如果误用
"w"还可能因换行符转换导致反序列化失败(UnpicklingError: invalid load key)
pickle.dump() 和 pickle.dumps() 怎么选
二者都做序列化,区别只在目标:一个是写入文件对象,一个是返回 bytes 对象。
- 要存到磁盘 → 用
pickle.dump(obj, file_handle),配合with open(..., "wb") as f: - 要先处理再写(比如加密、压缩、拼接)→ 用
pickle.dumps(obj)得到bytes,再自行写入 - 别混用:
pickle.dump(obj, f)后再对同一f调f.write(pickle.dumps(obj)),会导致文件内容错乱,反序列化时只读到第一个对象
反序列化时常见的崩溃点
pickle.load() 对文件位置敏感,且不校验数据完整性。
- 文件为空 → 抛
EOFError: Ran out of input - 文件被截断或损坏 →
UnpicklingError: invalid load key或类似提示 - 用不同 Python 版本序列化的数据,在另一版本反序列化可能失败(尤其是
protocol=5在 3.8+ 才支持) - 如果文件里存了多个对象(连续调用多次
pickle.dump),必须用循环 +try/except EOFError逐个load,不能只调一次
跨环境或长期存储慎用 pickle:它执行任意代码的能力意味着加载不受信文件等于执行任意命令。真要持久化,优先考虑 json(限基础类型)或 msgpack(更紧凑、无执行风险),pickle 只适合可信进程内短周期缓存。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











