文章目录
为什么选择HDF5?
在数据处理领域,HDF5(Hierarchical Data Format)可谓是大数据时代的隐形冠军。相比传统的CSV、Excel等格式,HDF5拥有三大杀手锏:
- 层次分明 - 类文件夹结构管理数据
- 高效存储 - 支持TB级数据快速存取
- 跨平台 - 通用格式无缝衔接各语言
特别适合处理科学计算、深度学习中的海量数据,堪称数据管理的瑞士军刀。
一、HDF5文件结构解密
打开HDF5文件就像进入一个数据超市:
- Groups:类似文件夹,用于组织数据
- Datasets:实际存储的多维数据矩阵
- Attributes:元数据标签,记录关键信息
二、Python实战:h5py快速上手
h5py官方文档:https://docs.h5py.org/en/stable/index.html
2.1 安装只需1行
pip install h5py
2.2 获取HDF5文件流
通过h5py.File(path,mode)
可以新建或者获取已有的HDF5文件流。
mode:
"w"
:会覆盖已存在的文件,直接创建新的HDF5数据"r"
:默认模式,只读"r+"
:可修改
创建hdf5文件的示例:(这里是用上下文管理器(with语句)来保证文件关闭,如果直接将文件流放到内存里,要记得close()
掉)
import h5py
# 创建新文件('w'模式会覆盖已存在的文件)
with h5py.File('my_data.hdf5', 'w') as f:
# 创建数据集:存储10x10的随机矩阵
f.create_dataset('temperature', data=np.random.rand(10,10)) # 指定data的写法
f.create_dataset('calender', (3,4)) # 指定shape的写法
# 添加元数据
f.attrs['create_date'] = '2024-03-20'
2.3 数据读写
with h5py.File('my_data.hdf5', 'r+') as f:
# 读取数据
temp_data = f['temperature'] # h5py._hl.dataset.Dataset
temp_data_value = temp_data[:] # numpy.ndarray
print(temp_data.name) # temperature
print(temp_data.shape) # (10,10)
print(temp_data.dtype) # float64
# 修改部分数据
f['temperature'][0,0] = 36.5
# 修改所有数据
f['temperature'][...] = numpy_data
# 创建group
group = f.create_group('sensors') # h5py.Group
# 获取group对象到内存中也使用键名
group = f["sensors"]
# 获取所有键名(这里包括dataset和group)
keys = f.keys() # 返回一个迭代器
# 用f.visit(func)来直接遍历所有dataset和group
def print_name(name):
print(name)
f.visit(print_name)
# group就完全可以当成hdf5来用,创建数据什么的都跟hdf5文件流的一样:
group.create_dataset('sensor1', data=[1,2,3]) # 指定data的写法
group.create_dataset('sensor2', (3,4)) # 指定shape的写法
三、高手技巧:进阶操作
3.1 分块存储大文件
# 创建支持分块存储的数据集
dset = f.create_dataset("big_data", (1000, 1000),
chunks=(100, 100),
compression="gzip")
常用压缩方式对比:
压缩方式 | 压缩率 | 速度 |
---|---|---|
gzip | 中 | 快 |
lzf | 低 | 最快 |
szip | 高 | 慢 |
四、直观查看hdf5数据
软件:HDF Explorer
键名如果是中文而想直接显示的话似乎必须是GBK编码的字节流格式才行呢。