【问题标题】:Python 2.7 pickle won't recognize numpy multiarrayPython 2.7 pickle 无法识别 numpy 多数组
【发布时间】:2016-02-12 10:00:46
【问题描述】:

我需要从合作者那里加载一组腌制数据。问题是,看来我需要多阵列。我的代码如下:

f = open('data.p', 'rb')
a = pickle.load(f)

这是错误信息。

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

我以为是我电脑里编译的numpy的问题。所以我从我的 Arch Linux repo 中卸载了 numpy 并通过

安装了 numpy
sudo -H pip2 install numpy

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

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

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

【问题讨论】:

  • 你能在你正在解压的机器上import numpy 吗? numpy.__version__ 是什么?
  • 你知道它是用'wb'模式还是'w'写的吗?如果泡菜是在'w' 模式下编写的,你可以看到这个ImportError,尤其是当泡菜来自Windows 盒子时。
  • @MikeMcKerns 我会问他们的。但是如果他们使用'w',我能做些什么让它在我的机器上可读吗?喜欢更改 Returns 的符号?
  • @ali_m numpy.__version__1.10.4。对不起,错误的标题。而python版本是2.7.11
  • @Chong:我认为他们可以用负载阅读它,然后用wb 再次腌制它。这比在泡菜中编辑回报更可靠。

标签: python-2.7 numpy pickle


【解决方案1】:

感谢@MikeMcKems,问题现已解决。

此问题是由 MS Windows 和 Linux 使用的不同特殊符号引起的(例如,行尾符号)。我的合作者使用的是 Windows 机器,并使用

保存了数据
pickle.dump(obj, 'filename', 'w')

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

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

a=pickle.load(open('filename_in', 'r'))

然后以二进制形式输出

pickle.dump(a, open('filename_out', 'wb'))

由于二进制数据被普遍识别,只要你使用pickle读取它,文件filename_out在linux中很容易被Python识别。

【讨论】:

    猜你喜欢
    • 2020-11-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多