cPickle.load在Python中抛出ImportError

时间:2014-04-02 04:36:23

标签: python importerror pickle

我在Windows 7计算机上安装了Python 2.7.3。当我运行以下代码时

import nltk, json, cPickle, itertools

import numpy as np

from nltk.tokenize import word_tokenize
from pprint import pprint

t_given_a = json.load(open('conditional_probability.json','rb'))
a_unconditional = json.load(open('age.json','rb'))

t_unconditional = cPickle.load(open('freqdist.pkl','rb'))['distribution']

命令提示符给出了错误 “ImportError:没有名为Multiarray的模块。”

我对Python很新,我不确定为什么会发生这个错误。我搜索了其他线程,许多人建议使用'rb'而不是'r'。我有rb开始,它仍然给我这个错误。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

当你在python中pickle一个对象时,它将它的类保存为包名+类名的字符串。在unpickle python尝试导入该模块并找到该类来重新创建一个对象。如果您没有该模块可导入,则会导致ImportError。

只需安装Multiarray模块,如果你不知道它是哪一个,那么问问你从哪个拿到那个pickle文件。

答案 1 :(得分:2)

来自docs

  

请注意,功能(内置和用户定义)被“完全”腌制   合格的“名称参考,而不是价值。这意味着只有   功能名称被腌制,以及模块的名称   函数定义为。函数的代码,也不是函数的代码   功能属性是pickle。因此,定义模块必须是   可以在unpickling环境中导入,并且模块必须包含   命名对象,否则将引发异常。

     

同样,类通过命名引用进行pickle,因此具有相同的限制   破坏环境适用。请注意,没有类的代码   或者数据被腌制

     

[...]这些限制是可选功能和类必须的原因   在模块的顶层定义