我有一个包含数据数组的bz2压缩二进制文件(big endian)文件。使用外部工具解压缩然后将文件读入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函数不会返回文件对象。你知道读取压缩文件的正确方法是什么吗?
答案 0 :(得分:5)
BZ2File
返回类似文件的对象(尽管不是实际文件)。问题是你正在调用read()
:
dfile = bz2.BZ2File('myfile.bz2').read()
这会将整个文件作为一个大字符串读入内存,然后传递给fromfile
。
根据您的numpy
和python
版本以及您的平台,从类似文件的对象中读取非实际文件可能无效。在这种情况下,您可以使用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)
(毋庸置疑,还有一些其他替代品可能比将整个缓冲区读入内存更好。但如果你的文件不是太大,这将有效。)