我已经通过Instagram API收集了一些数据,这些数据已存储到pandas DataFrame中,而DataFrame又通过pandas .to_pickle()
方法保存了。
尝试使用read_pickle()方法在另一台计算机上加载DataFrame时,返回以下错误:
Traceback (most recent call last):
File "examine.py", line 14, in <module>
dataframe = pd.read_pickle(args["dataframe"])
File "/home/user/virtualenvs/geopandas/local/lib/python2.7/site-packages/pandas/io/pickle.py", line 65, in read_pickle
return try_read(path)
File "/home/user/virtualenvs/geopandas/local/lib/python2.7/site-packages/pandas/io/pickle.py", line 62, in try_read
return pc.load(fh, encoding=encoding, compat=True)
File "/home/user/virtualenvs/geopandas/local/lib/python2.7/site-packages/pandas/compat/pickle_compat.py", line 117, in load
return up.load()
File "/usr/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/usr/lib/python2.7/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named instagram.models
知道是什么原因造成的吗?
最佳答案
Pickle根本不知道如何重新创建类。如何取消选择和恢复类的信息存储在该类内部:__new__
,__init__
,__setstate__
等。
同样,当对类实例进行腌制时,其类的代码和数据也不会随之被腌制。仅实例数据被腌制。这样做是有目的的,因此您可以修复类中的错误或向类中添加方法,并仍然加载使用该类的早期版本创建的对象。如果您打算使用寿命很长的对象,而该对象将看到一个类的许多版本,则可能值得在对象中添加版本号,以便可以通过该类的__setstate__()
方法进行适当的转换。
资料来源:Python pickle: What can be pickled and unpickled?
因此,要释放它,pickle
需要加载该类(以及所有中间模块)。
如果您没有/想要instagram
模块,则应该在腌制之前检查如何将原始数据框中的适当值转换为普通类(int
,float
,array
,...)它。