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

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

解决方法:

BZ2File确实返回一个类文件对象(虽然不是实际文件).问题是你正在调用read():

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

这会将整个文件作为一个大字符串读入内存,然后将其传递给file.

根据您的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)

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

上一篇:使用bzlib.h在C中进行BZ2压缩


下一篇:python – 为什么从文件末尾搜索允许BZip2文件而不是Gzip文件?