为什么选择HDF5?
在数据处理领域,HDF5(Hierarchical Data Format)可谓是大数据时代的隐形冠军。相比传统的CSV、Excel等格式,HDF5拥有三大杀手锏:
特别适合处理科学计算、深度学习中的海量数据,堪称数据管理的瑞士军刀。
一、HDF5文件结构解密
打开HDF5文件就像进入一个数据超市:
- Groups:类似文件夹,用于组织数据
- Datasets:实际存储的多维数据矩阵
- Attributes:元数据标签,记录关键信息
二、Python实战:h5py快速上手
h5py官方文档:https://docs.h5py.org/en/stable/index.html
2.1 安装只需1行
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.ndarrayprint(temp_data.name) # temperatureprint(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和groupdef 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数据
软件1:HDF Explorer
键名如果是中文而想直接显示的话似乎必须是GBK编码的字节流格式才行呢。
软件2:HDFView
五、常见问题
- 1. OSError: Unable to open file(file signature not found):这就是纯文件损坏的问题,我是U盘传HDF5文件后中出现的这个问题,换个移动硬盘就好了。
六、本文撰写过程中参考的其他网络资料
- 1. Python中的h5py包使用(详细图文教程)https://blog.csdn.net/qq_40280673/article/details/135392999
- 2. 报错:h5文件读取失败-OSError:Unable to open file (file signature not found) - pythoner_wl - 博客园 https://www.cnblogs.com/pythonwl/p/14189474.html