Python:读取压缩(.gz)HDF文件而不写入和保存未压缩文件

Python:读取压缩(.gz)HDF文件而不写入和保存未压缩文件,python,compression,gzip,hdf,Python,Compression,Gzip,Hdf,我有大量压缩的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') 从pyhdf.SD导入SD,SDC 导入操作系统 系统('gunzipfile1.HDF') HDF=

我有大量压缩的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')
从pyhdf.SD导入SD,SDC
导入操作系统
系统('gunzipfile1.HDF')
HDF=SD('file1.HDF')
并对每个文件重复此操作。然而,这比我想要的要耗费更多的时间

我在想,可能大部分时间的悬置都来自于将压缩文件写入新的未压缩版本,如果我只需一步将文件的未压缩版本读入
SD
函数,我就可以加快速度


我的想法正确吗?如果是这样的话,有什么方法可以满足我的要求吗?

sascha认为hdf透明压缩比gzipping更合适,这是正确的,尽管如此,如果您无法控制hdf文件的存储方式,那么您正在寻找
gzip
python模块,它可以从这些文件中获取数据。

sascha认为hdf透明压缩比gzip压缩更合适,这是正确的,尽管如此,如果您无法控制hdf文件的存储方式,那么您正在寻找
gzip
python模块,它可以从这些文件中获取数据。

根据pyhdf,这是不可能的

__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模块:

根据pyhdf,这是不可能的

__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模块:


那太尴尬了。正确的用法应该是在hdf中进行透明压缩(因此您不必在写和读的过程中在意)!您描述的此设置仅可用于存档(因为压缩是hdf不知道的额外层)。您没有指定您的用例,但在某些情况下(您希望从这些用例中读取许多迭代):在打开压缩的情况下将每个用例转换为新的hdf(或者如果内存没有问题,只需解压缩即可)!备注python还支持许多没有基于文件的管道的解压工具。要想在这里找到一个好的答案,您必须查看
pyhdf
的详细信息——您可以在python中获得与gzip流对应的类似文件的对象,但是需要知道类似文件的对象是否足够好,或者pyhdf库是否需要一个真正的文件(或者更糟糕的是,需要一个文件名以便它可以打开文件本身)。(即使它真的想要一个文件名,如果pyhdf不需要它的输入文件是可查找的,人们也可以使用FIFO来玩把戏,但同样,这需要对该库的实现细节进行一点调查)。这很尴尬。正确的用法应该是在hdf中进行透明压缩(所以在写和读的过程中你不必在意)!你描述的这个设置只可用于存档(因为压缩是hdf不知道的一个额外的层)。你没有指定你的用例,但在某些情况下(你想从中读取多次迭代):在打开压缩的情况下将每个转换为一个新的hdf(或者,如果内存没有问题,只需解压缩)!Remark python还支持许多没有基于文件的管道的解压工具。要在这里找到一个好的答案,您必须查看
pyhdf
的详细信息——您可以在python中获得与gzip流相对应的类似文件的对象,但需要知道类似文件的对象是否足够好,或者pyhdf库是否重新启动需要一个真实的文件(或者更糟的是,需要一个文件名,这样它就可以自己打开文件)。(即使它真的需要一个文件名,如果pyhdf不需要它的输入文件是可查找的,人们也可以使用FIFO玩把戏,但同样,这需要对该库的实现细节进行一些调查)。你能给我一个在这种情况下如何使用gzip模块的例子吗?答案应该是回答这个问题,而不是指向他们可以找到答案的地方。链接应该是答案本身的补充,而不是核心。更重要的是,如果
gzip
模块返回一个类似文件的对象,那么答案只是一个可接受的o不知道pyhdf库是否可以实际使用该对象。这是一个事实密集型调查,一个没有编写代码的答案可能没有执行过这样的调查。正如上面@kevin mcdonough所演示的,hdf c api并不能简单地将类似python文件的对象传递给它,
pydhf
pytables
目前不允许。很抱歉在发布之前没有注意到这一点。你能给我一个在这种情况下如何使用gzip模块的例子吗?答案应该是回答问题的,而不是指向某人可以找到答案的地方。链接应该是补充,而不是答案本身的核心。更重要的是,如果
gzip
module返回一个类似文件的对象,如果pyhdf库可以实际使用该对象,则答案是可接受的。这是一个事实密集型调查,没有编写代码的答案可能没有执行过此类调查。正如上面@kevin mcdonough演示的那样,hdf c api并不能使调查变得简单将类似python文件的对象传递给它,此时
pydhf
pytables
都不允许。很抱歉在发布之前没有注意到这一点。