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

标签 python numpy bzip2

我有一个包含数据数组的 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

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

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

关于python - 将 bz2 压缩二进制文件导入为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16012266/

相关文章:

python , flask : Executemany with multiple fields in HTML form

python - 在 Python 中生成动画 GIF

arrays - 变量矩阵 NumPy 的值

python - boost::python 从 numpy.ndarray 返回值中提取 C++ 值

python - 读取 tarfile 内的大文件头 (~9GB),无需完全提取

python - 使用索引索引 Tensor 的第二维

python - 如何使用 setuptools 安装 scipy 和 numpy

c++ - 使用boost解压文件

azure - 将 Azure Batch 任务输出保留到 Azure 存储

python - MAXent分类器NLTK输出理解