【问题标题】:Python: Read compressed (.gz) HDF file without writing and saving uncompressed filePython:读取压缩(.gz)HDF文件而不写入和保存未压缩文件
【发布时间】:2017-08-29 05:07:16
【问题描述】:

我有大量压缩的 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')

并为每个文件重复此操作。但是,这比我想要的更耗时。

我认为大部分时间可能是由于将压缩文件写入新的未压缩版本而导致的,如果我能够将文件的未压缩版本读入 @ 987654323@功能一步到位。

我的这种想法正确吗?如果是这样,有没有办法做我想做的事?

【问题讨论】:

  • 这很尴尬。正确的用法是 hdf 中的透明压缩(因此您在写入和阅读期间不必关心)!您描述的此设置仅可用于存档(因为压缩是 hdf 不知道的额外层)。您没有指定您的用例,但在某些情况下(您想从中读取许多迭代):将每个转换为一个新的 hdf 并启用压缩(或者如果内存没有问题,则只需解压缩)! 备注 python 还支持许多解压工具,无需基于文件的管道。
  • 人们真的必须查看pyhdf 的详细信息才能在这里得到一个很好的答案——可以在 Python 中获得一个与 gzipped 流相对应的类文件对象,但需要知道如果一个类似文件的对象足够好,或者 pyhdf 库需要一个真实的文件(或者更糟糕的是,一个文件名,以便它可以打开文件本身)。
  • (即使它确实需要一个文件名,也可以使用 FIFO 玩技巧 if pyhdf 不需要它的输入文件是可搜索的,但同样,这有点必须对图书馆实施的细节进行调查)。

标签: python compression gzip hdf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    sascha 是正确的,hdf 透明压缩比 gzipping 更充分,但是如果您无法控制 hdf 文件的存储方式,您正在寻找gzip python 模块(docs) 它可以从这些中获取数据文件。

    【讨论】:

    • 你能举个例子说明在这种情况下如何使用gzip模块吗?
    • 答案应该是回答问题,而不是指出某人可以找到答案的地方。链接应该是补充,而不是答案本身的核心。
    • 更重要的是——如果gzip 模块返回一个类似文件的对象,那么只有在pyhdf 库可以实际使用该对象的情况下,答案才是可接受的。这是一项事实密集型调查,没有编写代码的答案可能还没有进行过这样的调查。
    • 正如@kevin-mcdonough 上面演示的那样,hdf c api 并不能简单地将 python 文件类对象传递给它,pydhf 和 pytables 目前都不允许这样做。很抱歉在发布之前没有注意到这一点。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多