Python:读取压缩(.gz)HDF文件,无需写入并保存未压缩文件
问题描述:
我有大量压缩的HDF文件,需要阅读。Python:读取压缩(.gz)HDF文件,无需写入并保存未压缩文件
file1.HDF.gz
file2.HDF.gz
file3.HDF.gz
...
我可以在未压缩的HDF文件用以下方法
from pyhdf.SD import SD, SDC
import os
os.system('gunzip <file1.HDF.gz> file1.HDF')
HDF = SD('file1.HDF')
阅读并重复此为每个文件。但是,这比我想要的更耗时。
我在想,它可能大部分的时间来自于将压缩文件写入一个新的未压缩版本,并且如果我只是能够将未压缩的文件读入SD
功能一步到位。
我在这个想法中正确吗?如果是这样,有没有办法做到我想要的?
答
根据pyhdf package documentation,这是不可能的。
__init__(self, path, mode=1)
SD constructor. Initialize an SD interface on an HDF file,
creating the file if necessary.
没有其他方式来实例化一个采用类文件对象的SD对象。这很可能是因为它们符合外部接口(NCSA HDF)。 HDF格式通常也处理大量文件,这些文件不可能一次存储在内存中。
将它解压缩为一个文件可能是您的最高性能选项。
如果你想留在Python,使用gzip的模块(docs):
import gzip
import shutil
with gzip.open('file1.HDF.gz', 'wb') as f_in, open('file1.HDF', 'rb') as f_out:
shutil.copyfileobj(f_in, f_out)
这是尴尬。正确的用法在hdf内是透明压缩的(所以你在写作和阅读时不必关心)!您所描述的这种设置仅适用于归档(因为压缩是hdf不知道的额外层)。你没有指定你的用例,但是在某些情况下(你想从这些中读取很多迭代):将每个变换转换为一个新的hdf,并进行压缩(或者只是在内存不是问题时解压缩)! **备注** python还支持许多解压缩工具,而无需基于文件的管道。 – sascha
我们真的得看看'pyhdf'的细节,在这里得到一个很好的答案 - 可以得到一个类似于文件的对象,与Python中的gzipped流相对应,但是需要知道类文件对象是或者如果pyhdf库需要一个真实的文件(或者更糟的是,一个文件名,所以它可以打开文件本身)。 –
(即使它确实需要一个文件名,如果* pyhdf不需要其输入文件是可搜索的,那么可以使用FIFOs的技巧*但是,再次,这是一个调查,必须做一些细节图书馆的实施)。 –