HDF5⽂件--python使⽤简介
引:在使⽤TensorFlow,学习回调函数时,使⽤了ModelCheckpoint(),产⽣了.h5的⽂件。为了了解回调函数产⽣的信息,需要了解HDF5的相关内容,以及在python中的使⽤与相关问题解决。
⽂中⼀些叙述为了⽅便初次接触者理解,表述并不严谨,仅供简单参考。
初次见⾯
HDF5(Hierarchical Data Formal)是⽤于存储⼤规模数值数据的较为理想的存储格式,⽂件后缀名为h5,存储读取速度⾮常快,且可在⽂件内部按照明确的层次存储数据,同⼀个HDF5可以看做⼀个⾼度整合的⽂件夹,其内部可存放不同类型的数据。
在Python中操纵HDF5⽂件的⽅式主要有两种
是利⽤pandas中内建的⼀系列HDF5⽂件操作相关的⽅法,来完成相关操作。
⼆是利⽤h5py模块来完成Python原⽣数据结构与HDF5格式的转化
本篇主要介绍hdf5的基础内容和对应模块使⽤的快速⼊门。
初遇时的差池
⼀段⼩插曲
HDF是HDF(Hierarchical Data File)是美国国家⾼级计算应⽤中⼼(National Center for Supercomputing Application,NCSA)为了满⾜各种领域研究需求⽽研制的⼀种能⾼效存储和分发科学数据的新型数据格式 。阅读的⽂档中提到了到国家卫星⽓象中⼼(NSMC)曾经发布过⼀份《HDF5.0 使⽤简介》,抱着些许迷信权威的⼼态阅读后发现它涉及的信息就我⽬前来说价值不⼤,其中主要有讲HDF5⽂件的组织,API,创建,数据集数据空间,组,属性等等,内容⼤⽽全,但似乎这篇教材发布的相对较早,所以产⽣了⼀定的局限性并且内部的相关URL都失效了,它本⾝也在国家卫星⽓象中⼼的官⽹上没有什么存在的痕迹。相关的API只涉及了C和FORTRAN的外壳包装函数。对于像我这样在使⽤python且第⼀次接触HDF5的使⽤者并不友好,索性只读了开头的基础内容并建⽴了更详细的认知后就放弃了继续阅读的打算。
相识
⾸先从hdf5⽂件讲起。
HDF5⽂件具有两类存储对象,dataset和group。dataset是类似于数组的数据集,⽽group是类似⽂件夹⼀样的容器,存放dataset和其他group。
HDF本意即是层次数据格式,所以就其存储结构来说是类似与POSIX风格的。其实现的⽅式就是group。每层都⽤’/'分隔。我们创建的file object其实也可以看作⼀个group,是⼀个root group,其余的groups可以称为subgroups。
dataset与numpy中的array相似,⽐如都具有shape、dtype、以及⼀些切⽚操作等。虽然与Numpy的数组在接⼝上很相近,但是⽀持更多对外透明的存储特征,如数据压缩,误差检测,分块传输。
HDF5的⼀个很好的features就是可以在数据旁边存储元数据。所有的group和dataset都⽀持叫做属性的数据形式。
h5py
想到python⼀定有对应的⽂件解析库,于是我开始了h5py的“快速”⼊门。
import h5py
# 读取
file= h5py.File('test.hdf5','r')# .hdf5与.h5意义相同
# ⼀下也可以完成读取
with h5py.File("mytestfile.hdf5","w")as f:
# 我们需要注意的是group(包括File对象)与python中的字典相似
# 通过该⽅法可以获得对应group下的subgroups或datasets,返回包含字符串的列表
f.keys()
# 此时我们假设存在⼀个名为DataSet的dataset对象
# 利⽤对应键来索引值的⽅法可以获取该对象
dest = f['DataSet']
# dataset对象满⾜我们平时使⽤的numpy数组的⼀些操作,如下:
dest.shape
dest.dtype
dest[:]
mysql case when 用法# 创建HDF5⽂件
f = h5py.File('test.h5','w')
# 使⽤create_dataset创建给定形状和数据类型的空dataset
dataset = f.create_dataset('DS',(100,), dtype='i')
# 也可以使⽤numpy中数组来初始化
array = np.arange(100)
dataset = f.create_dataset('init', data=array)
group翻译# 分块存储
'''
在缺省设置下,HDF5数据集在内存中是连续布局的,也就是按照传统的C序。
Dataset也可以在HDF5的分块存储布局下创建。
也就是dataset被分为⼤⼩相同的若⼲块随意地分布在磁盘上,并使⽤B树建⽴索引。
'''
# 为了进⾏分块存储,将关键字设为⼀个元组来指⽰块的形状。
dset = f.create_dataset("chunked",(1000,1000), chunks=(100,100))
# 也可以⾃动分块,不必指定块的形状。
dset = f.create_dataset("autochunk",(1000,1000), chunks=True)
# 分层结构
# 遍历subgroups
for name in f:
print(name)
# 递归遍历所有subgroups
def print_name(name):
print(name)
f.visit(print_name)
# 属性通过attrs成员访问,类似于python中词典格式。
dataset.attrs['bias']=60
'bias'in dataset.attrs
⼀些其他的特性
1. 滤波器组
HDF5的滤波器组能够对分块数组进⾏变换。最常⽤的变换是⾼保真压缩。使⽤⼀个特定的压缩滤波器创建dataset之后,读写都可以向平常⼀样,不必添加额外的步骤。
⽤关键词compression来指定压缩滤波器,⽽滤波器的可选参数使⽤关键词compression_opt来指定:
dset = f.create_dataset("zipped",(100,100), compression="gzip")
2. HDF5⽂件的限制
HDF5⽂件本⾝⼤⼩没有限制,但是HDF5的⼀个dataset最⾼允许32个维,每个维度最多可有2^64个值,每个值⼤⼩理论上可以任意⼤
⽬前⼀个chunk允许的最⼤容量为2^32-1 byte (4GB). ⼤⼩固定的dataset的块的⼤⼩不能超过dataset的⼤⼩。
pandas
1. 写出
pandas中的HDFStore()⽤于⽣成管理HDF5⽂件IO操作的对象,其主要参数如下:
path:字符型输⼊,⽤于指定h5⽂件的名称(不在当前⼯作⽬录时需要带上完整路径信息)
mode:⽤于指定IO操作的模式,与Python内建的open()中的参数⼀致,默认为’a’,即当指定⽂件已存在时不影响原有数据写⼊,指定⽂件不存在时则新建⽂件;‘r’,只读模式;‘w’,创建新⽂件(会覆盖同名旧⽂件);‘r+’,与’a’作⽤相似,但要求⽂件必须已经存在;
complevel:int型,⽤于控制h5⽂件的压缩⽔平,取值范围在0-9之间,越⼤则⽂件的压缩程度越⼤,占⽤的空间越⼩,但相对应的在读取⽂件时需要付出更多解压缩的时间成本,默认为0,代表不压缩
下⾯我们创建⼀个HDF5 IO对象store:
import pandas as pd
store = pd.HDFStore('demo.h5')
'''查看store类型'''
print(store)
<class'pandas.io.pytables.HDFStore'>
File path: demo.h5
可以看到store对象属于pandas的io类,通过上⾯的语句我们已经成功的初始化名为demo.h5的的⽂件,本地也相应的出现了对应⽂件。
接下来我们创建pandas中不同的两种对象,并将它们共同保存到store中,⾸先创建series对象:
什么是英语拼写import numpy as np
#创建⼀个series对象
s = pd.Series(np.random.randn(5), index=['a','b','c','d','e'])
#创建⼀个dataframe对象
df = pd.DataFrame(np.random.randn(8,3),
columns=['A','B','C'])
第⼀种⽅式利⽤键值对将不同的数据存⼊store对象中,这⾥为了代码简洁使⽤了元组赋值法:
store['s'],store['df']= s,df
第⼆种⽅式利⽤store对象的put()⽅法,其主要参数如下:
key:指定h5⽂件中待写⼊数据的key
value:指定与key对应的待写⼊的数据
format:字符型输⼊,⽤于指定写出的模式,'fixed’对应的模式速度快,但是不⽀持追加也不⽀持检索;'table’对应的模式以表格的模式写出,速度稍慢,但是⽀持直接通过store对象进⾏追加和表格查询操作
使⽤put()⽅法将数据存⼊store对象中:
store.put(key='s',value=s);store.put(key='df',value=df)
既然是键值对的格式,那么可以查看store的items属性(注意这⾥store对象只有items和keys属性,没有values属性):
store.items
调⽤store对象中的数据直接⽤对应的键名来索引即可:
store['df']
删除store对象中指定数据的⽅法有两种,⼀是使⽤remove()⽅法,传⼊要删除数据对应的键:
print(store.keys())
⼆是使⽤Python中的关键词del来删除指定数据:
del store['s']
print(store.keys())
这时若想将当前的store对象持久化到本地,只需要利⽤close()⽅法关闭store对象即可:
store.close()
'''查看store连接状况,False则代表已关闭'''
store.is_open
# 这时本地的h5⽂件也相应的存储进store对象关闭前包含的⽂件
除了通过定义⼀个确切的store对象的⽅式,还可以从pandas中的数据结构直接导出到本地h5⽂件中:
#创建新的数据框
df_ = pd.DataFrame(np.random.randn(5,5))
#导出到已存在的h5⽂件中,这⾥需要指定key
df_.to_hdf(path_or_buf='demo.h5',key='df_')
#创建于本地demo.h5进⾏IO连接的store对象
store = pd.HDFStore('demo.h5')
#查看指定h5对象中的所有键
print(store.keys())
2. 读⼊
在pandas中读⼊HDF5⽂件的⽅式主要有两种,⼀是通过上⼀节中类似的⽅式创建与本地h5⽂件连接的IO对象,接着使⽤键索引或者store对象的get()⽅法传⼊要提取数据的key来读⼊指定数据:
java map删除元素store = pd.HDFStore('demo.h5')
'''⽅式1'''
df1 = store['df']
'''⽅式2'''数据库中orderby的用法
df2 = ('df')
df1 == df2
可以看出这两种⽅式都能顺利读取键对应的数据。
第⼆种读⼊h5格式⽂件中数据的⽅法是pandas中的read_hdf(),其主要参数如下:
path_or_buf:传⼊指定h5⽂件的名称
key:要提取数据的键
需要注意的是利⽤read_hdf()读取h5⽂件时对应⽂件不可以同时存在其他未关闭的IO对象,否则会报错,如下例:
print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')
把IO对象关闭后再次提取:
store.close()
print(store.is_open)
df = pd.read_hdf('demo.h5',key='df')
df气象python零基础入门教程
1. 元数据是关于数据的组织、数据域及其关系的信息,简⾔之,元数据就是关于数据的数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论