在 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 上退出。)
我有一个 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))
感谢您的支持!
如果您没有绑定到特定的库,您可能需要检查 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 上退出。)