3

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

4

1 回答 1

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)

(不用说,还有许多其他选择可能比将整个缓冲区读入内存更好。但如果您的文件不是太大,这将起作用。)

于 2013-04-15T09:57:41.173 回答