2017-08-28 84 views
0

我有大量压缩的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功能一步到位。

我在这个想法中正确吗?如果是这样,有没有办法做到我想要的?

+0

这是尴尬。正确的用法在hdf内是透明压缩的(所以你在写作和阅读时不必关心)!您所描述的这种设置仅适用于归档(因为压缩是hdf不知道的额外层)。你没有指定你的用例,但是在某些情况下(你想从这些中读取很多迭代):将每个变换转换为一个新的hdf,并进行压缩(或者只是在内存不是问题时解压缩)! **备注** python还支持许多解压缩工具,而无需基于文件的管道。 – sascha

+0

我们真的得看看'pyhdf'的细节,在这里得到一个很好的答案 - 可以得到一个类似于文件的对象,与Python中的gzipped流相对应,但是需要知道类文件对象是或者如果pyhdf库需要一个真实的文件(或者更糟的是,一个文件名,所以它可以打开文件本身)。 –

+0

(即使它确实需要一个文件名,如果* pyhdf不需要其输入文件是可搜索的,那么可以使用FIFOs的技巧*但是,再次,这是一个调查,必须做一些细节图书馆的实施)。 –

回答

3

根据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) 
0

萨沙是HDF透明压缩比gzip压缩比较充足,但是如果你无法控制的HDF文件如何存储你要找的gzip蟒蛇modulue (docs)它可以从这些文件中的数据正确。

+0

你能举一个例子说明在这种情况下如何使用gzip模块吗? – hm8

+0

@ hm8官方文档有什么问题? – sascha

+0

答案有望*回答问题*,而不是指出某人在哪里可以找到答案。链接应该是补充,而不是答案本身的核心。 –