【问题标题】:Search a HDF5 File for a specific Group- or Dataset-Name, to get its Path在 HDF5 文件中搜索特定的组名或数据集名,以获取其路径
【发布时间】:2022-02-04 00:07:01
【问题描述】:

我有一个 HDF5 文件,其中包含多个组和子组中的数据集。 我想通过名称获取特定组或数据集的路径。

HDF5 文档中显示了一个很好的方法:https://docs.h5py.org/en/stable/high/group.html

with h5py.File('File.hdf5','r') as hf:    
    def find_Name (hf):
        if 'Name' in hf:
            return hf
    
    hf.visit(find_Name)
    
>>>'Group/subGroup/Name'

解决方案的问题是,我无法在每次调用 hf.visit(find_Name) 时更改数据集/组的“名称”

如何在每次调用时定义一个新的字符串,该函数正在搜索?

以下操作无效:

with h5py.File('File.hdf5','r') as hf: 
    def find_Name (hf,Name):
        if Name in hf:
            return hf
    
    Name = 'NameOfDataset'
    hf.visit(find_Name(hf,Name))

感谢您的支持!

【问题讨论】:

    标签: python hdf5 h5py


    【解决方案1】:

    您的第二次尝试失败,因为 h5py 访问者函数(.visit().visititems())不支持其他关键字。 (换句话说,你不能将Name 添加到函数的参数列表中。)但是,创建一个函数来模仿它们的递归行为并不复杂——你只需要递归调用相同的函数来下降到任何组你发现。 (PyTables 具有支持此功能的功能......但如果您有兴趣,我会将其保存为不同的答案。)看看这段代码:

    with h5py.File('File.hdf5','r') as hf: 
        
        def check_Name(Name,grp,prefix=''):
            for obj_name, obj in grp.items():
                path = f'{prefix}/{obj_name}'
                if Name == obj_name:
                    return path
                elif isinstance(obj, h5py.Group): # test for group (go down)
                    gpath = check_Name(Name, obj, path)
                    if gpath:
                        return gpath
    
        Name = 'Name'
        path = check_Name(Name,hf)
        if path:
            print(f'{Name} Found: {path}')
        else:    
            print(f'{Name} not Found')
           
        Name = 'NameOfDataset'
        path = check_Name(Name,hf)
        if path:
            print(f'{Name} Found: {path}')
        else:    
            print(f'{Name} not Found')
    

    您的架构的输出是:

    Name Found: /Group/subGroup/Name
    NameOfDataset not Found
    

    注意:这只会返回输入 Name 的第一次出现。如果您需要查找多个匹配项,则需要转换为生成器函数。 (仅供参考,使用.visit() 具有相同的限制——它在返回时退出。)

    【讨论】:

    • 非常感谢您的回答,您的脚本完成了我想要的工作!
    【解决方案2】:

    如果您没有绑定到特定的库,您可能需要检查HDFql,它可以大大减轻您处理 HDF5 的低级细节。在使用 HDFql 的 Python 中,要获取名为 dset 的数据集的绝对路径,该数据集存储在名为 test.h5 的 HDF5 文件中的任何位置(即组/子组)中,可以如下解决:

    import HDFql
    
    HDFql.execute("SHOW DATASET test.h5 LIKE **/dset")
    
    HDFql.cursor_first()
    
    print("The dataset 'dset' is located at: %s" % HDFql.cursor_get_char())
    

    如果您想获取名为的组的绝对路径,例如 grp,请改为执行以下操作:

    HDFql.execute("SHOW GROUP test.h5 LIKE **/grp")
    

    最后,如果您不关心它是组还是数据集,只需这样做:

    HDFql.execute("SHOW test.h5 LIKE **/obj")
    

    【讨论】:

    • 感谢您的回答!不幸的是需要坚持 h5py :(
    猜你喜欢
    • 2018-04-24
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2019-11-22
    • 2012-06-02
    • 2020-04-27
    相关资源
    最近更新 更多