【Python教程】h5py开源库如何使用详解

所需工具:

Python

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等

 

教程如下

一、h5py模块介绍

本文只是简单的对h5py库的基本创建文件,数据集和读取数据的方式进行介绍!如果读者需要进一步详细的学习h5py的更多知识,请参考h5py的官方文档。

h5py简单介绍

一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,它好比python中的字典,有键(key)和值(value),存放dataset和其他group。在使用h5py的时候需要牢记一句话:groups类比字典dataset类比Numpy中的数组

HDF5的dataset虽然与Numpy的数组在接口上很相近,但是支持更多对外透明的存储特征,如:数据压缩误差检测分块传输

二、h5py模块使用

h5py创建的文件后缀名为:.hdf5

1、h5py接口简单介绍

h5py模块的使用主要分成两步走:

1)创建.hdf5类型文件句柄(创建一个对象) # 读取文件把“w”改成“r”

f=h5py.File(“myh5py.hdf5″,”w”)

2)创建数据(dataset)或组(group)

创建数据(dataset):


 	f.create_dataset(self, name, shape=None, dtype=None, data=None, **kwds)

创建组(group):


 	create_group(self, name, track_order=False)

2、h5py的使用样例

创建一个h5py文件


 	import h5py
 	#要是读取文件的话,就把w换成r
 	f=h5py.File("myh5py.hdf5","w")

在当前目录下会生成一个myh5py.hdf5文件

创建dataset数据集


 	import h5py
 	f=h5py.File("myh5py.hdf5","w")
 	#deset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型
 	d1=f.create_dataset("dset1", (20,), 'i')
 	for key in f.keys():
 	     print(key)
 	     print(f[key].name)
 	     print(f[key].shape)
 	     print(f[key].value)
 	输出:
 	dset1
 	/dset1
 	(20,)
 	[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

这里我们仅仅创建了一个存放20个整型元素的数据集,并没有赋值,默认全是0,如何赋值呢,看下面的代码。


 	import h5py
 	import numpy as np
 	f=h5py.File("myh5py.hdf5","w")
 	d1=f.create_dataset("dset1",(20,),'i')
 	#赋值
 	d1[...]=np.arange(20)
 	#或者我们可以直接按照下面的方式创建数据集并赋值
 	f["dset2"]=np.arange(15)
 	 
 	for key in f.keys():
 	     print(f[key].name)
 	     print(f[key].value)
 	 
 	输出:
 	/dset1
 	[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
 	/dset2
 	[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]

如果我们有现成的numpy数组,那么可以在创建数据集的时候就赋值,这个时候就不必指定数据的类型和形状了,只需要把数组名传给参数data


 	import h5py
 	import numpy as np
 	f=h5py.File("myh5py.hdf5","w")
 	a=np.arange(20)
 	d1=f.create_dataset("dset1",data=a)
 	for key in f.keys():
 	     print(f[key].name)
 	     print(f[key].value)
 	 
 	输出:
 	/dset1
 	[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

现在把这几种创建的方式混合写下。看下面的代码


 	import h5py
 	import numpy as np
 	f=h5py.File("myh5py.hdf5","w")
 	#分别创建dset1,dset2,dset3这三个数据集
 	a=np.arange(20)
 	d1=f.create_dataset("dset1",data=a)
 	d2=f.create_dataset("dset2",(3,4),'i')
 	d2[...]=np.arange(12).reshape((3,4))
 	f["dset3"]=np.arange(15)
 	for key in f.keys():
 	     print(f[key].name)
 	     print(f[key].value)
 	输出:
 	/dset1
 	[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
 	/dset2
 	[[ 0 1 2 3]
 	     [ 4 5 6 7]
 	     [ 8 9 10 11]]
 	/dset3
 	[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
 	3. 创建group组
 	import h5py
 	import numpy as np
 	f=h5py.File("myh5py.hdf5","w")
 	#创建一个名字为bar的组
 	g1=f.create_group("bar")
 	#在bar这个组里面分别创建name为dset1,dset2的数据集并赋值。
 	g1["dset1"]=np.arange(10)
 	g1["dset2"]=np.arange(12).reshape((3,4))
 	for key in g1.keys():
 	     print(g1[key].name)
 	     print(g1[key].value)
 	输出:
 	/bar/dset1
 	[0 1 2 3 4 5 6 7 8 9]
 	/bar/dset2
 	[[ 0 1 2 3]
 	     [ 4 5 6 7]
 	     [ 8 9 10 11]]

注意观察数据集dset1和dset2的名字是不是有点和前面的不一样,如果是直接创建的数据集,不在任何组里面,那么它的名字就是/+名字,现在这两个数据集都在bar这个group(组)里面,名字就变成了/bar+/名字,是不是有点文件夹的感觉!继续看下面的代码,你会对group和dataset的关系进一步了解。


 	import h5py
 	import numpy as np
 	f=h5py.File("myh5py.hdf5","w")
 	#创建组bar1,组bar2,数据集dset
 	g1=f.create_group("bar1")
 	g2=f.create_group("bar2")
 	d=f.create_dataset("dset",data=np.arange(10))
 	#在bar1组里面创建一个组car1和一个数据集dset1。
 	c1=g1.create_group("car1")
 	d1=g1.create_dataset("dset1",data=np.arange(10))
 	#在bar2组里面创建一个组car2和一个数据集dset2
 	c2=g2.create_group("car2")
 	d2=g2.create_dataset("dset2",data=np.arange(10))
 	#根目录下的组和数据集
 	print(".............")
 	for key in f.keys():
 	     print(f[key].name)
 	#bar1这个组下面的组和数据集
 	print(".............")
 	for key in g1.keys():
 	     print(g1[key].name)
 	 
 	#bar2这个组下面的组和数据集
 	print(".............")
 	for key in g2.keys():
 	     print(g2[key].name)
 	#顺便看下car1组和car2组下面都有什么,估计你都猜到了为空。
 	print(".............")
 	print(c1.keys())
 	print(c2.keys())
 	输出:
 	.............
 	/bar1
 	/bar2
 	/dset
 	.............
 	/bar1/car1
 	/bar1/dset1
 	.............
 	/bar2/car2
 	/bar2/dset2
 	.............
 	[]
 	[]

Reference:

1、blog.csdn.net/csdn1569884…

2、blog.csdn.net/yudf2010/ar…

标签

发表评论

评论列表(1)