Как проверить файл .h5 в Python

Как посмотреть, какие переменные, наборы данных и т. д. есть в данном файле .h5 в Python?

Я могу прочитать файл, запустив это

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

Как теперь я могу увидеть, какие переменные есть в моем файле .h5?

Запуск f.keys() выводит неинформативный

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

В Matlab я просто вызываю h5disp(имя файла), но хотел бы знать, как это сделать в Python


person gota    schedule 12.04.2017    source источник
comment
Вы используете python3?   -  person Dmitri Chubarov    schedule 12.04.2017
comment
да............   -  person gota    schedule 12.04.2017
comment
Тогда решение, предложенное @Astrom, должно помочь   -  person Dmitri Chubarov    schedule 12.04.2017
comment
В Python3 dictionary.keys() дает «KeysView», который должен быть расширен с помощью list (или может использоваться непосредственно в итерации).   -  person hpaulj    schedule 12.04.2017


Ответы (3)


Ты пробовал?

print(list(f.keys()))

Это должно дать вам всю группу внутри вашего файла hdf5. Вы можете сделать то же самое для наборов данных, если f является группой.

person Astrom    schedule 12.04.2017
comment
Это необходимо, так как в Python3 f.keys() возвращает и итератор, который должен быть явно развернут в список. - person Dmitri Chubarov; 12.04.2017
comment
Он выводит '['#refs#', 'var1', 'var2', 'var3', 'var4']' что означает #refs#? - person gota; 12.04.2017
comment
Я бы посоветовал заглянуть внутрь '#ref#', чтобы увидеть, что внутри. Насколько мы можем судить, это группа внутри вашего файла hdf5, но без дополнительной информации (которой у вас может не быть) о том, как она была создана, трудно сказать. - person Astrom; 12.04.2017
comment
Это также работает, если вы хотите получить список ключей для отладки: keys = [key for key in f.keys()] - person Good Will; 13.02.2019

Может быть, излишество, но у меня было это и может быть полезно для кого-то:

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'])])]
person Imanol Luengo    schedule 12.04.2017

Я столкнулся с этим вопросом, пытаясь найти способ отобразить каждый отдельный узел в файле 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)

Следовательно, я буду использовать это в приложении с графическим интерфейсом, я собираюсь разрешить выбор только элементов с пометкой «набор данных».

person A. Ahmed    schedule 08.05.2020