h5py 常用API
h5py 是一个强大的 Python 库,用于与 HDF5 文件进行交互。HDF5(Hierarchical Data Format)是一种用于存储和组织大规模科学数据的文件格式。h5py 允许用户创建、读取和修改 HDF5 文件中的数据集和元数据。
下面是 h5py 库的一些常见 API 和操作示例:
1. 导入 h5py
 
import h5py
 
2. 创建 HDF5 文件
你可以使用 h5py.File() 函数来创建或打开 HDF5 文件,并指定模式:
'w':写入模式,创建新文件或覆盖现有文件。'r':只读模式,打开现有文件。'a':追加模式,打开文件用于读写,如果文件不存在则创建它。
# 创建一个新的 HDF5 文件
with h5py.File('example.h5', 'w') as f:pass  # 文件创建成功后可以在此处添加数据
 
3. 创建数据集
数据集(Dataset)是 HDF5 文件中的主要数据存储结构,类似于 NumPy 数组。可以使用 create_dataset() 方法创建一个新的数据集。
import numpy as npwith h5py.File('example.h5', 'w') as f:# 创建一个形状为 (100, 100) 的数据集,数据类型为浮点数dset = f.create_dataset('my_data', (100, 100), dtype='f4')# 也可以从现有的 NumPy 数组创建数据集data = np.arange(100).reshape(10, 10)f.create_dataset('array_data', data=data)
 
4. 读取数据集
通过 h5py.File() 打开文件后,可以像字典一样访问文件中的数据集,并使用 [:] 操作符读取数据。
with h5py.File('example.h5', 'r') as f:# 获取数据集对象dset = f['my_data']# 读取数据data = dset[:]  # 读取整个数据集print(data.shape)
 
5. 创建和读取压缩数据集
HDF5 支持数据压缩,h5py 通过 compression 参数启用压缩。常用的压缩方法是 gzip。
with h5py.File('compressed.h5', 'w') as f:# 创建一个使用 gzip 压缩的数据集dset = f.create_dataset('compressed_data', (1000, 1000), compression="gzip", compression_opts=9)# 写入随机数据dset[:, :] = np.random.random((1000, 1000))
 
在读取压缩数据时不需要额外的操作,h5py 会自动解压缩。
with h5py.File('compressed.h5', 'r') as f:# 读取压缩数据集data = f['compressed_data'][:]print(data.shape)
 
6. 数据集切片与访问
类似于 NumPy 数组,HDF5 数据集可以进行切片操作,只读取数据集的一部分,而不需要将整个数据集加载到内存中。
with h5py.File('example.h5', 'r') as f:# 只读取数据集的一部分partial_data = f['my_data'][10:20, 10:20]print(partial_data)
 
7. 创建分块(Chunked)数据集
分块数据集允许按块存储数据,这样可以优化大规模数据集的存储和读取性能。通过设置 chunks 参数来启用分块。
with h5py.File('chunked_data.h5', 'w') as f:# 创建分块数据集,每块的大小为 (100, 100)dset = f.create_dataset('chunked_data', (1000, 1000), chunks=(100, 100))# 写入数据dset[:, :] = np.random.random((1000, 1000))
 
8. 管理元数据(Attributes)
每个数据集和文件对象都可以存储 属性(Attributes),这些属性是附加的元数据。你可以通过字典的方式来读写属性。
with h5py.File('example.h5', 'w') as f:# 创建一个数据集dset = f.create_dataset('my_data', (100, 100))# 设置属性dset.attrs['description'] = 'This is a dataset of random numbers'dset.attrs['units'] = 'arbitrary'# 读取属性description = dset.attrs['description']units = dset.attrs['units']print(description, units)
 
9. 创建和读取组(Groups)
组(Groups)是 HDF5 文件中的容器,用于组织数据集。你可以将组看作是类似文件系统中的文件夹,数据集就是文件。
with h5py.File('group_example.h5', 'w') as f:# 创建一个组group = f.create_group('experiment_1')# 在组内创建数据集group.create_dataset('temperature', (100,))group.create_dataset('pressure', (100,))# 访问组内数据集temp_data = f['experiment_1/temperature'][:]
 
10. 遍历 HDF5 文件
可以遍历 HDF5 文件中的所有组和数据集。visit() 和 visititems() 方法可以帮助遍历整个文件。
with h5py.File('group_example.h5', 'r') as f:# 访问所有的数据集名称def print_name(name):print(name)f.visit(print_name)  # 递归访问所有节点(组和数据集)# 访问数据集的详细信息def print_name_and_type(name, obj):print(name, type(obj))f.visititems(print_name_and_type)  # 访问组和数据集,并显示类型
 
11. 删除数据集和组
可以使用 Python 的 del 操作符来删除数据集或组。
with h5py.File('example.h5', 'a') as f:# 删除数据集del f['my_data']
 
12. 文件模式
在处理 HDF5 文件时,h5py.File() 可以接收不同的模式参数:
'r':只读模式,不能修改文件。'r+':读写模式,打开文件并进行修改。'w':写入模式,覆盖现有文件。'w-'或'x'
:创建模式,创建一个新文件,如果文件已存在则引发错误。
'a':追加模式,文件存在时打开,文件不存在时创建。
示例:
# 打开文件以追加模式
with h5py.File('example.h5', 'a') as f:# 如果存在新数据,可以继续添加数据集或修改已有数据new_dset = f.create_dataset('new_data', (50, 50), dtype='f4')new_dset[:, :] = np.random.random((50, 50))
 
总结
h5py 是一个非常强大的库,允许你与 HDF5 格式的数据文件进行灵活的交互。通过掌握创建文件、数据集、压缩、分块、元数据管理以及组的组织结构等常用操作,可以高效地处理大规模科学数据。
