使用dill.load()加载大pickle文件遇UnicodeDecodeError的解决方法
解决dill.load()加载大pickle文件时的UnicodeDecodeError问题
首先,最直接的解决方案是在调用dill.load()时显式指定编码参数,针对你遇到的0xef字节解码错误,优先尝试latin1编码:
import dill # 打开文件时务必用*二进制模式'rb'*,这是序列化文件加载的基础 with open('你的大文件.pkl', 'rb') as f: loaded_data = dill.load(f, encoding='latin1')
为什么这个方法有效?
这个错误通常发生在以下场景:
- 你的pickle文件是用Python 2生成的(Python 2默认用ASCII编码处理字符串,而Python 3+的pickle/dill默认用UTF-8)
- 保存文件时没有指定合适的编码,导致部分非ASCII字节被以ASCII格式存储
latin1是单字节编码,它能映射所有0-255的字节值,不会因为字节不在ASCII范围内就抛出解码错误,完美适配这种新旧版本或编码不匹配的情况。
如果latin1不行,试试这些备选方案
- 尝试
encoding='utf-8':如果文件是用UTF-8编码保存的,只是加载时默认用了ASCII就会报错 - 尝试
encoding='unicode_escape':适合处理包含转义字符的字符串数据
避免后续再遇到这个问题的建议
如果你是自己生成的pickle文件,下次保存时指定更高的protocol版本和明确的编码,既能优化大文件的内存占用,也能避免编码冲突:
import dill with open('大文件.pkl', 'wb') as f: # protocol=4及以上适合大对象,支持高效的内存管理 dill.dump(your_large_data, f, protocol=4, encoding='utf-8')
额外提示
你提到用_pickle.load()会触发内存错误,dill本身对大对象的序列化/反序列化支持更好,但如果文件超大,也可以考虑分块处理?不过先解决编码问题,内存问题如果还存在的话,可以再针对性优化。
内容的提问来源于stack exchange,提问作者Philip Fu
相关产品推荐
相关产品推荐

