我有一个包含数据数组的 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 函数不返回文件对象。你知道压缩文件的正确读取方式是什么吗?
最佳答案
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)
(不用说,还有许多其他替代方案可能比将整个缓冲区读入内存更好。但如果您的文件不是太大,这会起作用。)
关于python - 将 bz2 压缩二进制文件导入为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16012266/