理解h5⽂件并使⽤python对h5格式⽂件进⾏读写操作
(⼀)HDF与h5
HDF(Hierarchical Data Format层次数据格式)是⼀种设计⽤于存储和组织⼤量数据的⽂件格式,最开始由美国国家超算中⼼研发,后来由⼀个⾮盈利组织HDF Group⽀持。HDF⽀持多种商业及⾮商业的软件平台,包括MATLAB、Java、Python、R和Julia等等,现在也提供了Spark。其版本包括了HDF4和现在⼤量⽤的HDF5。h5是HDF5⽂件格式的后缀。h5⽂件对于存储⼤量数据⽽⾔拥有极⼤的优势,这⾥安利⼤家多使⽤h5⽂件来存储数据,既⾼逼格⼜⾼效率。
(⼆)h5⽂件数据组织⽅式:像Linux⽂件系统⼀样组织数据
h5⽂件中有两个核⼼的概念:组“group”和数据集“dataset”。 ⼀个h5⽂件就是 “dataset” 和 “group” ⼆合⼀的容器。
dataset :简单来讲类似数组组织形式的数据集合,像 numpy 数组⼀样⼯作,⼀个dataset即⼀个numpy.ndarray。具体的dataset 可以是图像、表格,甚⾄是pdf⽂件和excel。
group:包含了其它 dataset(数组) 和 其它 group ,像字典⼀样⼯作。
⼀个h5⽂件被像linux⽂件系统⼀样被组织起来:dataset是⽂件,group是⽂件夹,它下⾯可以包含多个⽂件夹(group)和多个⽂件(dataset)。
形象来看h5数据组织⽅式⼤概像酱婶⼉的,诺!跟⽂件系统⼀样,⼤概知道它为啥叫层次数据格式了吧!
(三)使⽤python对h5⽂件进⾏操作
python对h5⽂件的操作依赖于h5py包
通过举个栗⼦来介绍h5py包是如何读写h5⽂件的
读h5⽂件:
# Reading h5 file
import h5py
with h5py.File('cat_dog.h5',"r")as f:
for key in f.keys():
#print(f[key], key, f[key].name, f[key].value) # 因为这⾥有group对象它是没有value属性的,故会异常。另外字符串读出来是字节流,需要解码成字符串。
print(f[key], key, f[key].name)# f[key] means a dataset or a group object. f[key].value visits dataset' value,except group object.
"""
结果:
<HDF5 group "/dogs" (1 members)> dogs /dogs
<HDF5 dataset "list_classes": shape (2,), type "|S7"> list_classes /list_classes
<HDF5 dataset "train_set_x": shape (209, 64, 64, 3), type "|u1"> train_set_x /train_set_x
<HDF5 dataset "train_set_y": shape (209,), type "<i8"> train_set_y /train_set_y
代码解析:
⽂件对象f它表⽰h5⽂件的根⽬录(root group),前⾯说了group是按字典的⽅式⼯作的,通过f.keys()来到根⽬录下的所有dataset和group的key,然后通过key
来访问各个dataset或group对象。
结果解析:
1.我们可以发现这个h5⽂件下有1个叫dogs的⽂件夹(group)和3个⽂件(dataset)它们分别叫list_classes,train_set_x,train_set_y它们的shape都可知。
dogs group下有⼀个成员但我们不知道它是group还是dataset。
2.我们可以发现key和name的区别:
上层group对象是通过key来访问下层dataset或group的⽽不是通过name来访问的;
因为name属性它是dataset或group的绝对路径并⾮是真正的"name",key才是真正的"name"。
name绝对路径:⽐如下⽂中访问name得到:/dogs/husky,它表⽰根⽬录下有dogs这个挂载点,dogs下⼜挂载了husky。
"""
dogs_group = f["dogs"]
for key in dogs_group.keys():
print(dogs_group[key], dogs_group[key].name)
"""
结果:
<HDF5 dataset "husky": shape (64, 64, 3), type "<f8"> /dogs/husky
可见dogs⽂件夹下有个key为husky的⽂件dataset
python怎么读文件夹下的文件夹"""
from h5py import Dataset, Group, File
with File('cat_dog.h5','r')as f:
for k in f.keys():
if isinstance(f[k], Dataset):
print(f[k].value)
else:
print(f[k].name)
写h5⽂件:
# Writing h5
import h5py
import numpy as np
# mode可以是"w",为防⽌打开⼀个已存在的h5⽂件⽽清除其数据,故使⽤"a"模式
with h5py.File("animals.h5",'a')as f:
ate_dataset("husky",data=np.random.randn(64,64,3))# 在dogs⽂件夹下分别创建两个dataset,⼀张哈⼠奇图⽚和⼀张柴⽝的图⽚
ate_dataset("shiba",data=np.random.randn(64,64,3))
我们来检查⼀下这个animals.h5⽂件
with h5py.File('animals.h5','r')as f:
for fkey in f.keys():
print(f[fkey], fkey)
print("======= 优雅的分割线 =========")
'''
结果:
<HDF5 dataset "animals_included": shape (2,), type "|S4"> animals_included
<HDF5 dataset "cats": shape (5, 64, 64, 3), type "<f8"> cats
<HDF5 group "/dogs" (2 members)> dogs
'''
dogs_group = f["dogs"]# 从上⾯的结果可以发现根⽬录/下有个dogs的group,所以我们来研究⼀下它
for dkey in dogs_group.keys():
print(dkey, dogs_group[dkey], dogs_group[dkey].name, dogs_group[dkey].value)
'''
husky <HDF5 dataset "husky": shape (64, 64, 3), type "<f8"> /dogs/husky [[[ 6.22221467e-01 2.29412386e-01 1.70099600e-01] [-9.53310941e-01 -1.65325168e+00 6.50092663e-02]
[-2.33444396e-01 5.32328485e-01 -1.23046495e+00]
...
[-8.27186186e-04 -9.54570238e-01 1.20224835e+00]
[-3.03556381e-01 5.30470941e-01 -1.49928878e-01]
[ 5.24641964e-01 -1.55304472e+00 1.30016600e+00]]
...
'''
更多骚操作可以参考h5py官⽅⽂档。
参考⽂献:
[1]
[2]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论