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")
"""
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。