Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将bz2压缩二进制文件导入为numpy数组_Python_Numpy_Bzip2 - Fatal编程技术网

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

Python 将bz2压缩二进制文件导入为numpy数组,python,numpy,bzip2,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中直接解压。但是,我收到一条错误

我有一个包含数据数组的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()
这会将整个文件作为一个大字符串读入内存,然后从文件传递到

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

(不用说,还有很多其他方法可能比将整个缓冲区读入内存更好。但如果文件不是太大,这就行了。)

frombuffer()
在python2.7中似乎不起作用。由于属性错误:“ExFileObject”对象没有属性“\uuu buffer\uuuu”
,因此失败。知道为什么吗?没关系,我使用的是
zipfl=bz2.BZ2File('myfile.bz2').open('file_memver_in_archive')
,因为我想获得
dbuf.name
和成员的其他属性。然而,如果一个人像我一样需要
zipfl
成为
ExFileObjcet
,那么他可以简单地做
mydata=np.frombuffer(zipfl.read())
,并且两全其美。顺便说一句,将np.fromfile直接使用到bz2文件,对我来说不起作用,但np.frombuffer很好。