使用pickle加载数据集遇AttributeError,如何解决该问题?
解决Pickle加载时的AttributeError问题
这个错误我之前也碰到过!本质原因很简单:你用pickle保存data_samples类的实例时,这个类是在某个模块里定义的,但现在你加载pickle文件的脚本里,__main__模块(也就是当前运行的脚本)中没有这个data_samples类的定义,pickle找不到对应的类来重建对象,就抛出了这个错误。
下面给你几个可行的解决办法:
方法1:在当前脚本中重新定义data_samples类
如果这个类的定义不复杂,直接把当初定义data_samples的代码复制到你现在的脚本里就行。比如:
import pickle # 先定义和保存时完全一致的data_samples类 class data_samples: def __init__(self, ...): # 这里要和你之前的类定义完全匹配 # 类的属性和方法,和保存时保持一致 pass # 再加载pickle文件 infile = open('data_set.pkl','rb') data = pickle.load(infile) infile.close()
注意:类的名称、属性、方法必须和保存pickle时的完全一致,否则还是会出错。
方法2:从原来的模块导入data_samples类
如果data_samples类本来就是在某个单独的模块(比如my_dataset.py)里定义的,那直接在当前脚本中导入这个类就行:
import pickle from my_dataset import data_samples # 替换成你实际的模块名 infile = open('data_set.pkl','rb') data = pickle.load(infile) infile.close()
这样pickle就能找到对应的类定义,顺利重建对象了。
方法3:临时修改模块映射(适合快速调试)
如果不想导入模块或者复制类定义,可以在加载前把__main__模块的属性临时映射到原来的类所在模块,比如:
import pickle import sys # 假设data_samples原来在my_dataset模块里 sys.modules['__main__'].data_samples = __import__('my_dataset').data_samples infile = open('data_set.pkl','rb') data = pickle.load(infile) infile.close()
这个方法比较hacky,适合临时调试用,不推荐在正式代码里长期使用。
小提醒:pickle的加载严重依赖于序列化时的类定义,所以最好在保存pickle的时候,把对应的类定义放在单独的模块里,这样后续加载的时候直接导入模块就行,能避免很多这类问题。
内容的提问来源于stack exchange,提问作者Question
相关产品推荐
相关产品推荐

