将bz2压缩二进制文件导入为numpy数组

时间:2013-04-15 09:52:56

标签: python numpy bzip2

我有一个包含数据数组的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函数不会返回文件对象。你知道读取压缩文件的正确方法是什么吗?

1 个答案:

答案 0 :(得分: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)

(毋庸置疑,还有一些其他替代品可能比将整个缓冲区读入内存更好。但如果你的文件不是太大,这将有效。)