如何在Python中检查.h5文件

4

在Python中,我如何查看给定的.h5文件具有哪些变量、数据集等内容?

我可以通过运行以下代码读取文件:

import h5py
f = h5py.File(filename, 'r')

我现在该如何查看我的.h5文件有哪些变量?

运行f.keys()会输出不具信息性的内容。

KeysView(<HDF5 file filename (mode r)>)

在Matlab中,我只需要调用h5disp(filename)函数,但是我想知道在Python中该如何做。


1
你正在使用Python3吗? - Dima Chubarov
是的 - gota
2
那么@Astrom提出的解决方案应该会有所帮助。 - Dima Chubarov
在Python3中,dictionary.keys()返回一个'KeysView',需要使用list进行扩展(或可以直接在迭代中使用)。 - hpaulj
4个回答

8
也许有些过度,但我有这个东西,对某些人可能会有用:
from __future__ import print_function

def scan_hdf5(path, recursive=True, tab_step=2):
    def scan_node(g, tabs=0):
        print(' ' * tabs, g.name)
        for k, v in g.items():
            if isinstance(v, h5.Dataset):
                print(' ' * tabs + ' ' * tab_step + ' -', v.name)
            elif isinstance(v, h5.Group) and recursive:
                scan_node(v, tabs=tabs + tab_step)
    with h5.File(path, 'r') as f:
        scan_node(f)

还有简单的输入:

>>> scan_hdf5('/tmp/dummy.h5')
/
   - /d1
   /g1
     - /g1/d2
     - /g1/d3
   /g2
     - /g2/d4
     /g2/g3
       - /g2/g3/d5

或者返回更加实用的元素的替代版本:

def scan_hdf52(path, recursive=True, tab_step=2):
    def scan_node(g, tabs=0):
        elems = []
        for k, v in g.items():
            if isinstance(v, h5.Dataset):
                elems.append(v.name)
            elif isinstance(v, h5.Group) and recursive:
                elems.append((v.name, scan_node(v, tabs=tabs + tab_step)))
        return elems
    with h5.File(path, 'r') as f:
        return scan_node(f)

带回报:

>>> scan_hdf5_2('/tmp/dummy.h5')
[u'/d1',
 (u'/g1', [u'/g1/d2', u'/g1/d3']),
 (u'/g2', [u'/g2/d4', (u'/g2/g3', [u'/g2/g3/d5'])])]

太棒了,谢谢你的分享,帮我节省了大量时间! - Nek0pi
NameError: name 'h5' is not defined - undefined

7

你试过了吗?

print(list(f.keys()))

这应该能够为您提供hdf5文件中所有组的信息。如果f是一个组,您也可以对数据集执行同样的操作。


1
这是必需的,因为在Python3中,f.keys()返回一个迭代器,需要显式地扩展为列表。 - Dima Chubarov
它输出 '['#refs#', 'var1', 'var2', 'var3', 'var4']',#refs# 是什么意思? - gota
1
我建议查看“#ref#”内部以查看里面的内容。就我们所知,它是您的hdf5文件中的一个组,但是如果没有提供有关如何创建它的更多信息(可能您没有),则很难确定。 - Astrom
如果想要调试并获取键列表,以下代码同样适用:keys = [key for key in f.keys()] - Good Will

2

我在试图找到一种方法来显示h5文件中的每个节点,以便能够提取具有相应数据集的所需节点时,遇到了这个问题。

我认为这是一个非常简单但易于理解(对我来说)的片段:

h5 = h5py.File(filename, 'r')
def hierarchy(d):
    for item in d:
        if ' 0 member' in str(d[item]):
            print(d[item].name, ['empty group'])
        if isinstance(d[item], h5py.Group):
            hierarchy(d[item])
        else: #Dataset
            print(d[item].name, ['dataset'])
hierarchy(h5)

因此,我将在GUI应用程序中使用此功能,我将启用仅选择“数据集”标记的项目。

1

这将以层次结构打印出H5文件中包含的组和数据集。

import h5py

def printGroup(group):
    for i in list(group. keys()):
        try:
            if list(group[i].keys()):
                print(f"{group.name}/{i}/")
                printGroup(group[i])
        except:
            print(group[i].name, group[i].dtype, group[i].shape)

print("\n\nData File Structure")
f = h5py.File('filePath.h5', 'r')
printGroup(f)

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