如何列出h5py文件中的所有数据集?

39

我有一个存储numpy数组的h5py文件,但在尝试使用我记得的数据集名称打开它时,出现了“对象不存在错误”,那么我能以某种方式列出文件中包含哪些数据集吗?

   with h5py.File('result.h5','r') as hf:
        #How can I list all dataset I have saved in hf?

Python3的解决方案在这里 https://dev59.com/SV0Z5IYBdhLWcg3w0jCy - anilbey
6个回答

26

16
其他答案只是告诉你如何在根组下创建键列表,这些键可能指向其他组或数据集。
如果你想要更接近于h5dump的Python代码,可以尝试以下方法:
import h5py

def descend_obj(obj,sep='\t'):
    """
    Iterate through groups in a HDF5 file and prints the groups and datasets names and datasets attributes
    """
    if type(obj) in [h5py._hl.group.Group,h5py._hl.files.File]:
        for key in obj.keys():
            print sep,'-',key,':',obj[key]
            descend_obj(obj[key],sep=sep+'\t')
    elif type(obj)==h5py._hl.dataset.Dataset:
        for key in obj.attrs.keys():
            print sep+'\t','-',key,':',obj.attrs[key]

def h5dump(path,group='/'):
    """
    print HDF5 file metadata

    group: you can give a specific group, defaults to the root group
    """
    with h5py.File(path,'r') as f:
         descend_obj(f[group])

10
如果您想列出键名,您需要使用 keys() 方法来获取一个键对象,然后使用 list() 方法来列出这些键名:
with h5py.File('result.h5','r') as hf:
    dataset_names = list(hf.keys())

这对我不起作用,它说:“TypeError:'ItemsViewHDF5'对象不可调用”。有什么想法吗? - xaratustra

9

keys()函数只返回顶层键,并且也包含组名和数据集(正如Seb所指出的)。因此,您应该使用visit()函数(如jasondet所建议的),并仅保留指向数据集的键。

这个答案有几点是合并了jasondetSeb对简单函数的建议。

def get_dataset_keys(f):
    keys = []
    f.visit(lambda key : keys.append(key) if isinstance(f[key], h5py.Dataset) else None)
    return keys

1
这个非常简洁的代码完美地解决了我的问题 :) 我想如果 f[key] 是继承自 h5py.Dataset 的类的实例,那么 isinstance(f[key], h5py.Dataset) 可能会更好,尽管这种情况可能很少发生。 - ajz34
@ajz34,你说得完全正确,我根据你的建议修改了我的答案,谢谢 :) - Assaf

9
如果你在命令行中,可以使用其他人推荐的h5ls -r [文件]h5dump -n [文件]
在Python中,如果你想列出最上层组以下的内容,但不想编写自己的代码来遍历树,请尝试使用visit()函数。
with h5py.File('result.h5','r') as hf:
    hf.visit(print)

如果需要更高级的功能(例如包括属性信息),可以使用 visititems:

def printall(name, obj):
    print(name, dict(obj.attrs))

with h5py.File('result.h5','r') as hf:
    hf.visititems(printall)

4
为了展示底层数据集的名称,我只需使用h5dump -n <filename>,而无需运行Python脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接