如何用h5py区分HDF5数据集和组?

时间:2015-12-17 08:53:56

标签: python hdf5 h5py

我使用Python包h5py(版本2.5.0)来访问我的hdf5文件。

我想遍历文件的内容并对每个数据集执行某些操作。

使用visit方法:

import h5py

def print_it(name):
    dset = f[name]
    print(dset)
    print(type(dset))


with h5py.File('test.hdf5', 'r') as f:
    f.visit(print_it)

我获得的测试文件:

<HDF5 group "/x" (1 members)>
<class 'h5py._hl.group.Group'>
<HDF5 dataset "y": shape (100, 100, 100), type "<f8">
<class 'h5py._hl.dataset.Dataset'>

告诉我文件中有一个数据集和一个组。然而,除了使用type()来区分数据集和组之外,没有明显的方法。遗憾的是,h5py documentation对此主题没有任何说明。他们总是假设您事先知道什么是组以及数据集是什么,例如因为他们自己创建了数据集。

我希望有类似的东西:

f = h5py.File(..)
for key in f.keys():
    x = f[key]
    print(x.is_group(), x.is_dataset()) # does not exist

在使用h5py读取Python中的未知hdf5文件时,如何区分组和数据集?如何获取所有链接中所有组的所有数据集的列表?

5 个答案:

答案 0 :(得分:11)

不幸的是,h5py api中没有内置方法可以检查这一点,但您只需使用is_dataset = isinstance(item, h5py.Dataset)检查项目的类型。

要列出文件的所有内容(不过文件的属性除外),您可以使用带有可调用项的Group.visititems来获取项目的名称和实例。

答案 1 :(得分:4)

虽然Gall和James Smith的答案总体上表明了解决方案,但仍然需要完成遍历层次HDF结构和过滤所有数据集的遍历。我使用Python 3.3+中提供的yield from来完成它,它工作得非常好,并在此处呈现。

import h5py

def h5py_dataset_iterator(g, prefix=''):
    for key in g.keys():
        item = g[key]
        path = '{}/{}'.format(prefix, key)
        if isinstance(item, h5py.Dataset): # test for dataset
            yield (path, item)
        elif isinstance(item, h5py.Group): # test for group (go down)
            yield from h5py_dataset_iterator(item, path)

with h5py.File('test.hdf5', 'r') as f:
    for (path, dset) in h5py_dataset_iterator(f):
        print(path, dset)

答案 2 :(得分:1)

因为h5py使用python词典作为交互的选择方法,所以你需要使用&#34; values()&#34;实际访问项目的功能。所以你可以使用列表过滤器:

datasets = [item for item in f["Data"].values() if isinstance(item, h5py.Dataset)]

递归执行此操作应该很简单。

答案 3 :(得分:0)

我更喜欢这个解决方案。它找到hdf5文件“h5file”中所有对象的列表,然后根据类对它们进行排序,类似于之前提到的但不是如此简洁:

import h5py
fh5 = h5py.File(h5file,'r')
fh5.visit(all_h5_objs.append)
all_groups   = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Group) ]
all_datasets = [ obj for obj in all_h5_objs if isinstance(fh5[obj],h5py.Dataset) ]

答案 4 :(得分:0)

例如,如果要打印HDF5文件的结构,则可以使用以下代码:

def h5printR(item, leading = ''):
    for key in item:
        if isinstance(item[key], h5py.Dataset):
            print(leading + key + ': ' + str(item[key].shape))
        else:
            print(leading + key)
            h5printR(item[key], leading + '  ')

# Print structure of a `.h5` file            
def h5print(filename):
    with h5py.File(filename, 'r') as h:
        print(filename)
        h5printR(h, '  ')

示例

>>> h5print('/path/to/file.h5')

file.h5
  test
    repeats
      cell01: (2, 300)
      cell02: (2, 300)
      cell03: (2, 300)
      cell04: (2, 300)
      cell05: (2, 300)
    response
      firing_rate_10ms: (28, 30011)
    stimulus: (300, 50, 50)
    time: (300,)