Как вывести список данных в файл 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.