Существует два способа доступа к данным HDF5 с помощью Python: h5py и pytables .
Оба хороши, с разными возможностями:
- h5py (из часто задаваемых вопросов по h5py): пытается отобразить для функции HDF5 значение NumPy
как можно ближе. Некоторые говорят, что делает h5py более «питоническим».
- PyTables (из FAQ по PyTables): создает дополнительный уровень абстракции поверх HDF5 и NumPy. Имеет более обширный поиск
возможности (по сравнению с h5py).
При работе с данными HDF5 важно понимать модель данных HDF5. Это выходит за рамки этого поста. Для простоты представьте модель данных как файловую систему; где «группы» и «наборы данных» похожи на «папки» и «файлы». Оба могут иметь атрибуты. «узел» - это термин, используемый для обозначения «группы» или «набора данных».
@ Киран Рамачандра обрисовал метод с помощью h5py
. Поскольку вы пометили свой пост pytables
, описанный ниже тот же процесс с pytables
.
Примечание. В примере Кирана предполагается, что наборы данных 1,2,3 находятся на корневом уровне. Вы сказали, что у вас также есть группы. Вероятно, у ваших групп также есть несколько наборов данных. Вы можете использовать утилиту HDFView для просмотра модели данных и ваших данных.
import tables as tb
h5f = tb.open_file('a.h5')
Это дает вам файловый объект, который вы используете для доступа к дополнительным объектам (группам или наборам данных).
h5f.walk_nodes()
Это повторяемый объект для узлов и подузлов, который дает полную структуру данных HDF5 (помните, что "узлы" могут быть как группами, так и наборами данных). Вы можете перечислить все узлы и типы с помощью:
for anode in h5f.walk_nodes() :
print (anode)
Используйте следующее для получения (нерекурсивного) списка имен узлов Python:
h5f.list_nodes()
Будет извлечено значение атрибута cloudy
из dataset1
(если оно существует):
h5f.root.dataset1._f_getattr('cloudy')
Если вам нужны все атрибуты для узла, используйте это (показано для dataset1
):
ds1_attrs = h5f.root.dataset1._v_attrs._v_attrnames
for attr_name in ds1_attrs :
print ('Attribute', attr_name,'=' ,h5f.root.dataset1._f_getattr(attr_name))
Все вышеперечисленные ссылки dataset1
на корневом уровне (h5f.root
).
Если набор данных находится в группе, вы просто добавляете имя группы в путь.
Для dataset2
в группе с именем agroup
используйте:
h5f.root.agroup.dataset2._f_getattr('rainy')
Будет извлечено значение атрибута rainy
из dataset2
в agroup
(если оно существует)
Если вы хотите, чтобы все атрибуты для dataset2
:
ds2_attrs = h5f.root.agroup.dataset2._v_attrs._v_attrnames
for attr_name in ds2_attrs :
print ('Attribute', attr_name,'=' , h5f.root.agroup.dataset2._f_getattr(attr_name))
Для полноты прилагается ниже код для создания a.h5
, используемый в моем примере. numpy
требуется только для определения dtype
при создании таблицы. Как правило, файлы HDF5 являются взаимозаменяемыми (поэтому вы можете открыть этот пример с помощью h5py
).
import tables as tb
import numpy as np
h5f = tb.open_file('a.h5','w')
#create dataset 1 at root level, and assign attribute
ds_dtype = np.dtype([('a',int),('b',float)])
dataset1 = h5f.create_table(h5f.root, 'dataset1', description=ds_dtype)
dataset1._f_setattr('cloudy', 'True')
#create a group at root level
h5f.create_group(h5f.root, 'agroup')
#create dataset 2,3 at root.agroup level, and assign attributes
dataset2 = h5f.create_table(h5f.root.agroup, 'dataset2', description=ds_dtype)
dataset2._f_setattr('rainy', 'True')
dataset3 = h5f.create_table(h5f.root.agroup, 'dataset3', description=ds_dtype)
dataset3._f_setattr('cloudy', 'True')
h5f.close()