2017-02-10 84 views
1

我試圖把許多numpy的文件,以獲得一個大的numpy的文件中的一個大numpy的文件,我想請點擊此鏈接Python append multiple files in given order to one big file,這就是我所做的:追加多個numpy的文件在Python

import matplotlib.pyplot as plt 
import numpy as np 
import os, sys 

#Read in list of files. You might want to look into os.listdir() 

path= "/home/user/Desktop/ALLMyTraces.npy/test" 
#Test folder contains all my numpy file traces 
traces= os.listdir(path) 

# Create new File 
f = open("/home/user/Desktop/ALLMyTraces.npy", "w") 

for j,trace in enumerate(traces): 

    # Find the path of the file 
    filepath = os.path.join(path, trace) 

    # Load file 
    dataArray= np.load(filepath) 
    f.write(dataArray) 

文件被創建,並驗證我有好的內容,我用這個代碼:

import numpy as np 
dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy') 
print(dataArray) 

這個錯誤產生的結果:

dataArray= np.load(r'/home/user/Desktop/ALLMyTraces.npy') 
    File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 401, in load 
    "Failed to interpret file %s as a pickle" % repr(file)) 
IOError: Failed to interpret file '/home/user/Desktop/ALLMyTraces.npy' as a pickle 

我真的不知道這個問題。任何幫助,將不勝感激。

回答

1

您應該使用numpy.savenumpy.savez來創建醃製的.npy或.npz二進制文件。只有那些文件可以被numpy.load()讀取。由於使用f.write(dataArray中),np.load()創建一個文本文件與上面提到的錯誤

這裏失敗是一個示例

fpath ="path to big file" 
npyfilespath ='path to nympy files to be merged ' 
os.chdir(npyfilespath) 

with open(fpath, 'wb') as f_handle: 
    for npfile in glob.glob("*.npy"): 

     # Find the path of the file 
     filepath = os.path.join(path, npfile) 
     print filepath 
     # Load file 
     dataArray= np.load(filepath) 
     print dataArray 
     np.save(f_handle,dataArray) 
dataArray= np.load(fpath) 
print dataArray 

剛剛發現,有一些非常有趣的在numpy負載。它不會一次加載所有的追加數組:)。請閱讀post瞭解更多信息。

這意味着,如果你想讀取所有附加數組,你需要多次加載它們。

f = open(fpath, 'rb') 
dataArray= np.load(f) #loads first array 
print dataArray 
dataArray= np.load(f) #loads Second array 
print dataArray 
dataArray= np.load(f) #loads Third array 
print dataArray 
+0

它給了我這樣的回答:<關閉的文件「<初始化文件>」,模式「<初始化文件>」在0x7f3ed40e48a0> – nass9801

+0

我沒有看到任何問題 – Shijo

+0

非常感謝您的幫助,但在這個CAS上文件僅保存最後一個文件的內容。 – nass9801

0

np.save寫入元塊(具有形狀和dtype種類的信息)和數據塊。 np.load是補充,能夠讀取該格式。

dataArray= np.load(filepath) 

dataArray現在是內存中的數組,就像原始數組一樣。它不是filepath內容的直接圖像。

f.write(dataArray) 

我什至不知道這寫入文件;它當然不是save/load兼容。因此,您的一般Python文件鏈接將向錯誤的方向發送。

有在一個文件保存多個陣列的直線前進方式:

  • concatentate陣列成一個較大的陣列,並保存。這需要尺寸兼容性。

  • np.savez將多個陣列保存到zip存檔。這是每個數組被保存到一個npy文件,並且這些都被收集到檔案中。 np.load是能夠加載這樣一個npz檔案(但讀它說延遲加載)。

這裏有一些變化。您可以使用外部工具推出自己的存檔。你也可以創建複雜的對象類型數組,這些數組可以被np.save/load處理。如果不能以普通方式保存元素,則它將恢復爲pickle。實際上,您可以使用pickle來保存多個陣列。

也有關於重複使用np.save到同一個文件的SO討論。這並不難,但做load會更棘手。 https://stackoverflow.com/a/35752728/901925