Как вывести список данных в файл h5py?

У меня есть файл h5py, хранящий массивы, но я получил Object doesn't exist error при попытке открыть его с именем набора данных, которое я помню, есть ли способ, которым я могу перечислить, какие наборы данных имеет файл?

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

6 ответов

Решение

Вы должны использовать метод ключей. Это даст вам список Unicode-строк вашего набора данных и имен групп. Например:

Datasetnames=hf.keys()

Другим графическим методом будет использование HDFView. https://support.hdfgroup.org/products/java/release/download.html

Другие ответы просто скажут вам, как составить список ключей в корневой группе, который может относиться к другим группам или наборам данных.

Если вы хотите что-то ближе к 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])

Если вы хотите перечислить имена ключей, вам нужно использовать метод keys(), который дает вам объект ключа, а затем использовать метод list() для получения списка ключей:

with h5py.File('result.h5','r') as hf:
    dataset_names = list(hf.keys())

Поскольку использование keys()функция предоставит вам только ключи верхнего уровня, а также будет содержать имена групп, а также наборы данных (как уже указывал ), вы должны использовать visit()функция (как было предложено ) и сохраните только ключи, указывающие на наборы данных.

Этот ответ представляет собой своего рода слияние jasondet и Seb на простую функцию, которая делает трюк:

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

Если вы находитесь в командной строке, используйте h5ls -r [file] или h5dump -n [file] как рекомендовано другими.

В 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)

Просто для отображения имени базовых наборов данных, я бы просто использовал h5dump -n <filename>

Это без запуска скрипта Python.

Другие вопросы по тегам