cPickle.load 在 Python 中抛出 ImportError

2 投票
2 回答
1746 浏览
提问于 2025-04-18 00:57

我在我的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: No Module named Multiarray。”

我对Python还比较陌生,不太明白为什么会出现这个错误。我查了其他讨论,很多人建议用'rb'代替'r'。我一开始就是用的rb,但还是出现了这个错误。有没有什么建议?

2 个回答

2

来自文档的内容:

要注意,函数(无论是内置的还是用户自定义的)在被“序列化”(也就是保存成一种可以存储的格式)时,是通过“完全限定”的名称来引用的,而不是通过它的值。这意味着,序列化时只保存了函数的名字,以及这个函数所在模块的名字。函数的代码和任何属性都不会被保存。因此,在反序列化(也就是把保存的数据还原成原来的格式)时,定义这个函数的模块必须能够被导入,如果模块里没有这个名字的对象,就会出现错误。

同样,类也是通过名字来引用进行序列化的,所以在反序列化时也要遵循相同的限制。要注意,类的代码和数据同样不会被保存。

[...] 这些限制就是为什么可以被序列化的函数和类必须在模块的顶层定义。

4

在Python中,当你对一个对象进行“序列化”(也就是把它保存起来)时,它会把这个对象的类名保存成一个字符串,格式是“包名 + 类名”。当你要把这个对象重新创建出来时,Python会尝试导入那个模块,并找到对应的类。如果你没有办法导入那个模块,就会出现一个叫做ImportError的错误。

所以,你只需要安装那个Multiarray模块。如果你不知道这个模块是什么,可以问一下给你这个序列化文件的人。

撰写回答