使用Python访问HDF5数据有两种方法:h5py and pytables。
两者都很好,但具有不同的功能:
-
h5py(来自 h5py FAQ):尝试将 HDF5 功能集映射到 NumPy
尽可能接近。有人说这让 h5py 更加“Pythonic”。
-
PyTables(来自 PyTables FAQ):在 HDF5 和 NumPy 之上构建一个额外的抽象层。它有更广泛的搜索
功能(与 h5py 相比)。
使用 HDF5 数据时,了解 HDF5 数据模型非常重要。这超出了本文的范围。为了简单起见,将数据模型视为文件系统;其中“组”和“数据集”就像“文件夹”和“文件”。两者都可以有属性。 “节点”是指“组”或“数据集”的术语。
@Kiran Ramachandra 概述了一种方法h5py
。由于您用以下标签标记了您的帖子pytables
,下面概述的是与pytables
.
注意:Kiran 的示例假设数据集 1、2、3 均位于根级别。你说你也有团体。您的小组可能也有一些数据集。您可以使用HDFView https://www.hdfgroup.org/downloads/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
from 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
, use:
h5f.root.agroup.dataset2._f_getattr('rainy')
这将获取属性的值rainy
from dataset2
in 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()