【问题标题】:Why does pandas attempt to import a module when reading from a pickled file?为什么 pandas 在读取腌制文件时会尝试导入模块?
【发布时间】:2017-01-10 13:48:25
【问题描述】:

我通过 Instagram API 收集了一些数据,并将其存储到 pandas 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 中保存的任何数据是否包含该类型的对象?你能显示 df.head() 和 df.dtypes。
  • 基于ImportError: No module named instagram.modelsDataFrame 内部很可能有来自instagram 模型的对象。您将能够通过检查数据类型来检查这一点。

标签: python pandas pickle instagram-api


【解决方案1】:

Pickle 根本不知道如何重新创建类。一个类是如何解封和恢复的信息存储在类中:__new____init____setstate__ 等等。

类似地,当类实例被腌制时,其类的代码和数据不会随之腌制。仅对实例数据进行腌制。 这是有意完成的,因此您可以修复类中的错误或向类中添加方法,并且仍然可以加载使用该类的早期版本创建的对象。如果您计划拥有可以看到一个类的多个版本的长期对象,则可能值得在对象中放置一个版本号,以便可以通过该类的 __setstate__() 方法进行适当的转换。

来源:Python pickle: What can be pickled and unpickled?

所以要取消它,pickle 需要加载类(以及任何中间模块)。

如果您没有/想要instagram-模块,您应该检查如何将原始数据框中的适当值转换为普通类(intfloatarray,...)在腌制之前。

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多