本文只适用于初学者,仅涉及文件的写入和读取,其他的部分可以参照官网。
hdf5官网:https://www.hdfgroup.org/solutions/hdf5/
hdf5文件是一种数据存储格式,Python有相应的包——h5py。
最好先下载HDFviewer
就是下面这个
下载地址:https://www.hdfgroup.org/downloads/hdfview/
测试环境:Ubuntu16.04
网上找了一些教程,包括官网的也浏览了一遍,写的都没毛病,但是让人理解的不是那么透彻。
这里打一个比方:
在没有电脑的时候,我们记录文件都是在纸上。可以说一张纸,是记录数据的基本单位。然而纸质文件多了,就需要分类,这时候就有了文件袋。文件袋多了,可以有文件柜。文件柜多了就可以有储藏室。以此类推,对于某个纸质文件,总能放在对应的位置。这种层级管理方式,放在电脑上就是文件(对应纸)和文件夹(文件袋,文件柜,储藏室等等以此类推)的关系。
hdf5文件的数据结构其实很简单,跟电脑上文件的储存方式一毛一样——文件和文件夹。
所不同的是,hdf5把文件和文件夹起了另外的名字——数据集(dataset)和组(group)。
之所以基本单位叫数据集是因为hdf5是专门存储数据的,之所以叫组就是分个组而已。。别想太多,真的就是这么简单。
创建名为test的hdf5文件,写入一个内容为1-5的dataset,这个dataset命名为dset1
import h5py
import numpy as np
f=h5py.File("test","w") # f是这个hdf5文件的句柄,test是文件名(生成test.hdf5,即,文件名不用加拓展名),“w"是可写
d1=f.create_dataset("dset1",data=np.arange(5)) # d1是dset的句柄,不做后续操作的话可以不要,不明白的话看了后文就晓得了
运行一下,可以看到生成了test.hdf5
用HDFviewer打开(打开后双击dset1)
更多种方式生成dataset
笔者总结了一下,好用的基本也就2种方法,上面的算一个,第二个写在下面,权当总结了。
import h5py
import numpy as np
f=h5py.File("test","w")
# method1
d1=f.create_dataset("dset1",data=np.arange(5)) # 返回一个dataset的句柄
# method2
f["dset2"]=np.arange(10).reshape(2,5) # 这种方式木有返回值
自己打开文件看一下,会瞬间明白,后文所有代码运行过后都看看,都会秒懂,不再贴图
修改数据
已经生成的数据想修改咋整?——①通过dataset的句柄②通过索引
import h5py
import numpy as np
f=h5py.File("test","w")
# method1
d1=f.create_dataset("dset1",data=np.arange(5))
# method2
f["dset2"]=np.arange(10).reshape(2,5)
# method1
d1[...]=np.arange(5)+10
# method2
f["dset2"][0]=100
创建一个名为folder1
的组,里面装2个dataset(后文folder误打成了floder)
import h5py
import numpy as np
f=h5py.File("test2","w")
g1=f.create_group("floder1")
g1["dset1"]=np.arange(10)
g1["dset2"]=np.arange(12).reshape(3,4)
生成如下结构的hdf5文件,数据随意(后文folder误打成了floder)
import h5py
import numpy as np
f=h5py.File("test3", "w")
g1=f.create_group("folder1")
g2=f.create_group("floder2")
f.create_dataset("dset",data=np.arange(10))
gg1=g1.create_group("floder1_sub")
d1=g1.create_dataset("dset1",data=np.arange(10))
gg2=g2.create_group("floder2_sub")
d2=g2.create_dataset("dset2",data=np.arange(30).reshape(2,5,3))
把hdf5文件的数据读进numpy里
import h5py
import numpy as np
data = h5py.File("./test3", "r") # .hdf5 object
print(data)
p=np.asarray(data["dset"])
pp=np.asarray(data["floder2"]["dset2"])
print(p)
print(pp)
<HDF5 file "test3" (mode r)>
[0 1 2 3 4 5 6 7 8 9]
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
[[15 16 17]
[18 19 20]
[21 22 23]
[24 25 26]
[27 28 29]]]