Python 2.7 pickle无法识别numpy多阵列

Cho*_*ong 4 numpy pickle python-2.7

我需要从协作者加载一组pickle数据.问题是,我似乎需要多阵列.我的代码如下:

f = open('data.p', 'rb')
a = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

这是错误信息.

ImportError                               Traceback (most recent call last)
<ipython-input-3-17918c47ae2d> in <module>()
----> 1 a = pk.load(f)

/usr/lib/python2.7/pickle.pyc in load(file)
   1382 
   1383 def load(file):
-> 1384     return Unpickler(file).load()
   1385 
   1386 def loads(str):

/usr/lib/python2.7/pickle.pyc in load(self)
    862             while 1:
    863                 key = read(1)
--> 864                 dispatch[key](self)
    865         except _Stop, stopinst:
    866             return stopinst.value

/usr/lib/python2.7/pickle.pyc in load_global(self)
   1094         module = self.readline()[:-1]
   1095         name = self.readline()[:-1]
-> 1096         klass = self.find_class(module, name)
   1097         self.append(klass)
   1098     dispatch[GLOBAL] = load_global

/usr/lib/python2.7/pickle.pyc in find_class(self, module, name)
   1128     def find_class(self, module, name):
   1129         # Subclasses may override this
-> 1130         __import__(module)
   1131         mod = sys.modules[module]
   1132         klass = getattr(mod, name)

ImportError: No module named multiarray
Run Code Online (Sandbox Code Playgroud)

我以为这是我计算机中编译的numpy的问题.所以我从Arch Linux repo中卸载了numpy并安装了numpy

sudo -H pip2 install numpy
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.我检查了文件夹$PACKAGE-SITE/numpy/core,multiarray.so在里面.我不知道为什么pickle无法加载模块.

我该如何解决这个问题?我还需要做什么?

PS1.我正在使用Arch Linux.并从去年10月开始尝试所有版本的python 2.7.它们都不起作用.PS2.由于问题在于加载步骤.我怀疑问题更可能来自python的内部冲突而不是数据文件.

Cho*_*ong 9

感谢@MikeMcKems,问题现在已经解决了.

问题是由MS Windows和Linux使用的不同特殊符号引起的(例如行尾符号).我的合作者正在使用Windows机器,并保存了数据

pickle.dump(obj, 'filename', 'w')
Run Code Online (Sandbox Code Playgroud)

数据以纯文本格式保存,其中包含许多特殊符号.当我用我的Linux机器加载数据时,符号被误解,从而导致问题.

解决它的最简单方法是找到一台Windows机器,加载数据

a=pickle.load(open('filename_in', 'r'))
Run Code Online (Sandbox Code Playgroud)

然后以二进制形式输出

pickle.dump(a, open('filename_out', 'wb'))
Run Code Online (Sandbox Code Playgroud)

由于只要您使用二进制数据pickle来读取二进制数据,因此filename_outPython中的文件很容易识别.