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
相关产品推荐
相关产品推荐

