加载含collections.defaultdict的pickle文件报错,求解决方法
解决加载含无默认工厂的
defaultdict的pickle文件时的repr错误 你遇到的问题根源在于合作者创建defaultdict时没有传入默认工厂函数(即直接调用defaultdict()而非defaultdict(工厂函数))。这种情况下,pickle序列化后的defaultdict对象的default_factory属性为None,加载后当Python尝试生成该对象的字符串表示(repr)时就会触发Unable to get repr for <class 'collections.defaultdict'>错误。
解决方案1:加载后转换为普通字典(最简单)
如果不需要保留defaultdict的自动生成默认值功能,直接将加载后的对象转为普通字典即可彻底解决问题:
from collections import defaultdict import pickle with open("dict_.pickle", "rb") as handle: dict_ = pickle.load(handle) # 转换为普通字典 dict_ = dict(dict_)
转换后就可以像使用普通字典一样正常操作,不会再出现repr相关错误。
解决方案2:手动设置default_factory以保留defaultdict结构
如果需要继续使用defaultdict的特性,可以在加载后手动为其设置一个默认工厂函数:
from collections import defaultdict import pickle with open("dict_.pickle", "rb") as handle: dict_ = pickle.load(handle) # 设置默认工厂,示例为返回None,可根据需求替换为其他函数(比如int、list等) dict_.default_factory = lambda: None
设置后,该defaultdict的repr可以正常生成,也能继续使用默认值功能。
解决方案3:让合作者修改保存代码(从根源避免)
如果后续还有类似文件需要交互,建议让合作者修改保存逻辑,二选一即可:
- 创建
defaultdict时明确传入默认工厂函数(如果确实需要defaultdict的功能):from collections import defaultdict import pickle # 比如设置默认值为None,或根据实际需求设置int、list等 dict_ = defaultdict(lambda: None) example_keys = ["a", "b", "c"] for i, key_ in enumerate(example_keys): dict_[key_] = 2 * i pickle.dump(dict_, open("dict_.pickle", "wb")) - 保存前将
defaultdict转为普通字典(如果不需要其特殊功能):from collections import defaultdict import pickle dict_ = defaultdict() example_keys = ["a", "b", "c"] for i, key_ in enumerate(example_keys): dict_[key_] = 2 * i # 转换为普通字典后再保存 pickle.dump(dict(dict_), open("dict_.pickle", "wb"))
内容的提问来源于stack exchange,提问作者student7481
相关产品推荐
相关产品推荐

