我已经通过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模块,则应该在腌制之前检查如何将原始数据框中的适当值转换为普通类(intfloatarray,...)它。

07-28 08:58