Python存储读取HDF5文件代码解析
HDF5简介
HDF(HierarchicalDataFormat)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF最早由美国国家超级计算应用中心NCSA开发,目前在非盈利组织HDF小组维护下继续发展。当前流行的版本是HDF5。HDF5拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活,通用,跨平台,可扩展,高效的I/O性能,支持几乎无限量(高达EB)的单文件存储等,详见其官方介绍:https://support.hdfgroup.org/HDF5/。
HDF5结构
HDF5文件一般以.h5或者.hdf5作为后缀名,需要专门的软件才能打开预览文件的内容。HDF5文件结构中有2primaryobjects:Groups和Datasets。
Groups就类似于文件夹,每个HDF5文件其实就是根目录(root)group'/',可以看成目录的容器,其中可以包含一个或多个dataset及其它的group。
Datasets类似于NumPy中的数组array,可以当作数组的数据集合。
每个dataset可以分成两部分:原始数据(raw)datavalues和元数据metadata(asetofdatathatdescribesandgivesinformationaboutotherdata=>rawdata)。
+--Dataset |+--(Raw)DataValues(eg:a4x5x6matrix) |+--Metadata ||+--Dataspace(eg:Rank=3,Dimensions={4,5,6}) ||+--Datatype(eg:Integer) ||+--Properties(eg:Chuncked,Compressed) ||+--Attributes(eg:attr1=32.4,attr2="hello",...) |
从上面的结构中可以看出:
- Dataspace给出原始数据的秩(Rank)和维度(dimension)
- Datatype给出数据类型
- Properties说明该dataset的分块储存以及压缩情况
- Chunked:Betteraccesstimeforsubsets;extendible
- Chunked&Compressed:Improvesstorageefficiency,transmissionspeed
- Attributes为该dataset的其他自定义属性
整个HDF5文件的结构如下所示:
+--/ |+--group_1 ||+--dataset_1_1 |||+--attribute_1_1_1 |||+--attribute_1_1_2 |||+--... ||| ||+--dataset_1_2 |||+--attribute_1_2_1 |||+--attribute_1_2_2 |||+--... ||| ||+--... || |+--group_2 ||+--dataset_2_1 |||+--attribute_2_1_1 |||+--attribute_2_1_2 |||+--... ||| ||+--dataset_2_2 |||+--attribute_2_2_1 |||+--attribute_2_2_2 |||+--... ||| ||+--... || |+--... |
一个HDF5文件从一个命名为"/"的group开始,所有的dataset和其它group都包含在此group下,当操作HDF5文件时,如果没有显式指定group的dataset都是默认指"/"下的dataset,另外类似相对文件路径的group名字都是相对于"/"的。
安装
pipinstallh5py
Python读写HDF5文件
#!/usr/bin/python #-*-coding:UTF-8-*- # #CreatedbyWWonJan.26,2020 #Allrightsreserved. # importh5py importnumpyasnp defmain(): #=========================================================================== #CreateaHDF5file. f=h5py.File("h5py_example.hdf5","w")#mode={'w','r','a'} #Createtwogroupsunderroot'/'. g1=f.create_group("bar1") g2=f.create_group("bar2") #Createadatasetunderroot'/'. d=f.create_dataset("dset",data=np.arange(16).reshape([4,4])) #Addtwoattributestodataset'dset' d.attrs["myAttr1"]=[100,200] d.attrs["myAttr2"]="Hello,world!" #Createagroupandadatasetundergroup"bar1". c1=g1.create_group("car1") d1=g1.create_dataset("dset1",data=np.arange(10)) #Createagroupandadatasetundergroup"bar2". c2=g2.create_group("car2") d2=g2.create_dataset("dset2",data=np.arange(10)) #Saveandexitthefile. f.close() '''h5py_example.hdf5filestructure +--'/' |+--group"bar1" ||+--group"car1" |||+--None ||| ||+--dataset"dset1" || |+--group"bar2" ||+--group"car2" |||+--None ||| ||+--dataset"dset2" || |+--dataset"dset" ||+--attribute"myAttr1" ||+--attribute"myAttr2" || | ''' #=========================================================================== #ReadHDF5file. f=h5py.File("h5py_example.hdf5","r")#mode={'w','r','a'} #Printthekeysofgroupsanddatasetsunder'/'. print(f.filename,":") print([keyforkeyinf.keys()],"\n") #=================================================== #Readdataset'dset'under'/'. d=f["dset"] #Printthedataof'dset'. print(d.name,":") print(d[:]) #Printtheattributesofdataset'dset'. forkeyind.attrs.keys(): print(key,":",d.attrs[key]) print() #=================================================== #Readgroup'bar1'. g=f["bar1"] #Printthekeysofgroupsanddatasetsundergroup'bar1'. print([keyforkeying.keys()]) #Threemethodstoprintthedataof'dset1'. print(f["/bar1/dset1"][:])#1.absolutepath print(f["bar1"]["dset1"][:])#2.relativepath:file[][] print(g['dset1'][:])#3.relativepath:group[] #Deleteadatabase. #Notice:themodeshouldbe'a'whenyoureadafile. ''' delg["dset1"] ''' #Saveandexitthefile f.close() if__name__=="__main__": main()
相关代码示例
创建一个h5py文件
importh5py
f=h5py.File("myh5py.hdf5","w")
创建dataset
importh5py f=h5py.File("myh5py.hdf5","w") #deset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型 d1=f.create_dataset("dset1",(20,),'i') forkeyinf.keys(): print(key) print(f[key].name) print(f[key].shape) print(f[key].value)
输出:
dset1
/dset1
(20,)
[00000000000000000000]
赋值
importh5py importnumpyasnp f=h5py.File("myh5py.hdf5","w") d1=f.create_dataset("dset1",(20,),'i') #赋值 d1[...]=np.arange(20) #或者我们可以直接按照下面的方式创建数据集并赋值 f["dset2"]=np.arange(15) forkeyinf.keys(): print(f[key].name) print(f[key].value)
输出:
/dset1
[012345678910111213141516171819]
/dset2
[01234567891011121314]
创建group
importh5py importnumpyasnp 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)) forkeying1.keys(): print(g1[key].name) print(g1[key].value)
输出:
/bar/dset1
[0123456789]
/bar/dset2
[[0123]
[4567]
[891011]]
删除某个key下的数据
#删除某个key,调用remove
f.remove("bar")
最后pandsa读取HDF5格式文件
importpandasaspd importnumpyasnp #将mode改成r即可 hdf5=pd.HDFStore("hello.h5",mode="r") #或者 """ hdfs=pd.read_hdf("hello.h5",key="xxx") """
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。