You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pickle读写字典列表时遭遇两类报错问题求助

解决Pickle序列化/反序列化的两个问题

先理清楚你遇到的两个问题,逐个击破:

第一个问题:pickle.loads()传入文件句柄导致的报错

pickle.loads()方法接收的是字节对象(bytes),而不是文件句柄。你改用pickle.load()的思路是对的——这个方法是专门用来从打开的二进制文件句柄里读取序列化对象的,但这又引出了第二个解码问题。

第二个问题:UnicodeDecodeError解码失败

这个错误是因为Python 3中pickle.load()默认用ascii编码反序列化字符串,但你的字典里包含了非ASCII字符(比如报错里的0xc6对应拉丁字符Æ)。解决方法很简单:调用load()时指定合适的编码参数,比如latin1(兼容Python 2导出的pickle数据)或者utf-8(如果你的字典原本用UTF-8存储字符串)。

另外要注意:你是多次调用pickle.dump()把单个字典写入文件,所以反序列化时也需要循环读取直到文件末尾,否则只会加载第一个字典。

修正后的反序列化代码示例:

import pickle

filename = "你的文件路径.pkl"
listOFDicts = []
with open(filename, 'rb') as pickleFile:
    while True:
        try:
            # 指定encoding参数解决解码问题,根据实际情况选latin1或utf-8
            dict_obj = pickle.load(pickleFile, encoding='latin1')
            listOFDicts.append(dict_obj)
        except EOFError:
            # 读取到文件末尾,退出循环
            break

# 现在listOFDicts就是你之前序列化的字典列表了
print(listOFDicts)

额外优化建议:

你可以考虑一次性序列化整个字典列表,而不是逐个dump,这样反序列化时只需一次load()操作,代码更简洁:

# 更简洁的序列化方式
with open(file_name, 'wb') as fd:
    pickle.dump(listOFDicts, fd)

对应的反序列化:

with open(filename, 'rb') as pickleFile:
    listOFDicts = pickle.load(pickleFile, encoding='latin1')

内容的提问来源于stack exchange,提问作者Omar K. Aly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:56:04