Hyp*_*ube 3 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)
Run Code Online (Sandbox Code Playgroud)
但是,由于还有很多其他类似的文件,我无法事先单独提取每个文件.因此,我发现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
Run Code Online (Sandbox Code Playgroud)
显然,BZ2File函数不返回文件对象.你知道读取压缩文件的正确方法是什么吗?
BZ2File 确实返回一个类文件对象(虽然不是实际文件).问题是你要求read()它:
dfile = bz2.BZ2File('myfile.bz2').read()
Run Code Online (Sandbox Code Playgroud)
这会将整个文件作为一个大字符串读入内存,然后传递给它fromfile.
根据您的版本numpy,并python与您的平台,从不是一个实际的文件可能无法正常工作一个类文件对象中读取.在这种情况下,您可以使用您读入的缓冲区frombuffer.
所以,要么:
dfile = bz2.BZ2File('myfile.bz2')
mydata = np.fromfile(dfile).reshape(dim,rows,cols)
Run Code Online (Sandbox Code Playgroud)
… 或这个:
dbuf = bz2.BZ2File('myfile.bz2').read()
mydata = np.frombuffer(dbuf).reshape(dim,rows,cols)
Run Code Online (Sandbox Code Playgroud)
(毋庸置疑,还有一些其他选择可能比将整个缓冲区读入内存更好.但如果你的文件不是太大,这将有效.)
| 归档时间: |
|
| 查看次数: |
1161 次 |
| 最近记录: |