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 格式的数据文件进行灵活的交互。通过掌握创建文件、数据集、压缩、分块、元数据管理以及组的组织结构等常用操作,可以高效地处理大规模科学数据。