2013-04-15 108 views
3

我有一個包含數據數組的bz2壓縮二進制(大端)文件。使用外部工具進行解壓縮,然後讀取文件中numpy的工作:將bz2壓縮的二進制文件導入爲numpy數組

import numpy as np 
dim = 3 
rows = 1000 
cols = 2000 
mydata = np.fromfile('myfile.bin').reshape(dim,rows,cols) 

然而,由於有大量的這樣的其他文件,我不能提取每一個單獨提前。因此,我找到了Python中的bz2模塊,它可以直接在Python中解壓縮它。但是,我收到一條錯誤消息:

dfile = bz2.BZ2File('myfile.bz2').read() 
mydata = np.fromfile(dfile).reshape(dim,rows,cols) 

>>IOError: first argument must be an open file 

顯然,BZ2File函數不返回文件對象。你知道什麼是正確的方式讀取壓縮文件?

回答

5

BZ2File確實返回類似文件的對象(雖然不是實際的文件)。問題是,我們在調用它read()

dfile = bz2.BZ2File('myfile.bz2').read() 

這將整個文件讀取到內存中一個大的字符串,然後您可以傳遞給fromfile

根據您的版本numpypython和您的平臺,從不是實際文件的類似文件的對象中讀取可能不起作用。在這種情況下,您可以使用您在frombuffer中讀取的緩衝區。

所以,無論是這樣的:

dfile = bz2.BZ2File('myfile.bz2') 
mydata = np.fromfile(dfile).reshape(dim,rows,cols) 

...或者這樣:

dbuf = bz2.BZ2File('myfile.bz2').read() 
mydata = np.frombuffer(dbuf).reshape(dim,rows,cols) 

(不用說,也有可能比讀取整個緩存到內存中更好的其他選擇的轉換。但如果你的文件不是太大,這將起作用。)

+0

frombuffer很棒,謝謝! – HyperCube

+0

'frombuffer()'在python2.7中似乎不起作用。它以'AttributeError失敗:'ExFileObject'對象沒有屬性'__buffer __''。任何想法爲什麼? –

+0

沒關係,我正在使用'zipfl = bz2.BZ2File('myfile.bz2')。open('file_memver_in_archive')'因爲我想獲得'dbuf.name'和成員的其他屬性。但是,如果像我這樣需要''''''''''''''''作爲'ExFileObjcet',就可以簡單地執行'mydata = np.frombuffer(zipfl.read())',並且兩全其美。 –