在 HDF5 文件中搜索特定的组名或数据集名,以获取其路径

Search a HDF5 File for a specific Group- or Dataset-Name, to get its Path

我有一个 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)

时更改 Dataset/Group 的“名称”

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

以下无效:

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

感谢您的支持!

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

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 访问者函数(.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

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