2016-02-12 82 views
4

我需要從協作者加載一組pickle數據。問題是,似乎我需要爲此進行多陣列。我的代碼如下:Python 2.7 pickle將無法識別numpy multiarray

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回購卸載numpy的,並通過

sudo -H pip2 install numpy 

然而,問題仍然存在安裝numpy的。我已經檢查了文件夾$PACKAGE-SITE/numpy/coremultiarray.so就在裏面。我不知道爲什麼鹹菜不能加載模塊。

我該如何解決問題?我還需要做什麼?

PS1。我正在使用Arch Linux。並從去年10月開始嘗試所有版本的Python 2.7。它們都不起作用。 PS2。由於問題出在裝載步驟。我懷疑這個問題更可能來自Python的內部衝突,而不是來自數據文件。

+1

你可以'''numpy'進口numpy'你unickickling從?什麼是'numpy .__ version__'? –

+3

你知道它是用「wb''模式還是'w''寫的?如果泡菜是用「w」模式寫的,你可以看到這個'ImportError',特別是當泡菜來自Windows盒子時。 –

+0

@MikeMcKerns我會問他們的。但是如果他們使用''w'',我能做些什麼來使它在我的機器上可讀?像改變退貨的象徵? – Chong

回答

8

感謝@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識別。