使用h5py模块进行处理的文件。后缀为hdf5。关于hdf5文件的作用,官方文档里有着简单的叙述,当然——是英文的:
HDF5 lets you store huge amounts of numerical data, and easily manipulate that data from NumPy. For example, you can slice into multi-terabyte datasets stored on disk, as if they were real NumPy arrays. Thousands of datasets can be stored in a single file, categorized and tagged however you want.
如果你想要深入且系统地学习h5py的相关知识,那么请查看官方文档的其他详细教程,链接如下:h5py官方文档
下面只是简单介绍相关的入门级知识,方便我们大家了解与使用。
hdf5文件能够存储两种类型的数据对象:数据集(dataset),组(group)
dataset可以类比为数组:和numpy的数组差不多
group可以类比为字典:有键(key)和值(value)。group中可以存放dataset或者其他的group。”键”就是组成员的名称,”值”就是组成员对象本身(组或者数据集)。
关于文件读写:
#读文件
import h5py
f=h5py.File("test.hdf5","r")
#写文件
import h5py
f=h5py.File("test.hdf5","w")
类似的,也可以采用下面的形式:
with h5py.File("文件名", 'r') as fin:
创建dataset数据集的代码如下:
import h5py
f=h5py.File("test.hdf5","w")
#dataset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型(int)
d1=f.create_dataset("dataset1", (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]
hdf5文件中的“HDF”意为“分层数据结构”,这一功能可以体现于hdf5的group类型对象。
我们可以将我们的hdf5文件看作是一个文件夹,这是一个根文件夹(也是root group),创建subgroup使用create_group实现,比如说:
#创建一个名字为bar的组
g1=f.create_group("bar")
在这个“文件夹”里面可以创建数据集:
#在bar这个组里面分别创建name为dset1,dset2的数据集并赋值。
g1["dset1"]=np.arange(10)
g1["dset2"]=np.arange(12).reshape((3,4))
其实这里的g1和f所拥有的方法是一样的,结构有点类似于一层一层的文件夹。
借用网上的一个小例子,可以清晰地说明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
.............
[]
[]
以上就是笔者在网络等资料中学习整理的h5py入门级的相关知识,如有不准确的地方,希望大家指正,我们一起学习进步。