【Python 】Python 读取HDF5文件
参考博客与网站:
https://baike.baidu.com/item/hdf%E6%96%87%E4%BB%B6/2590190
http://www.voidcn.com/article/p-aplswowh-bmq.html
https://www.cnblogs.com/dylancao/p/9756850.html
一、h5文件介绍
h5文件格式,HDF 的版本 5(HDF 版本 5不与 HDF 版本 4 及早期版本兼容).HDF是什么呢?就是Hierarchical Data Format,可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。大多数普通计算机都支持这种文件格式。
美国国家高级计算应用中心(National Center for Supercomputing Application,NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式 。HDF可以表示出科学数据存储和分布的许多必要条件。
1. HDF的优点
HDF的优点有:
自述性:对于一个HDF文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF允许应用程序解释HDF文件的结构和内容。
通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF数据结构,符号、数字和图形数据可以同时存储在一个HDF文件里。
灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF文件里。
扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
跨平台性:HDF是一个与平台无关的文件格式。HDF文件无需任何转换就可以在不同平台上使用。
2. HDF数据类型
HDF有6种主要数据类型:
栅格图象,调色板,科学数据库,注释,Vdata和Vgroup。
· 栅格图象: 数据模式提供一种灵活方式存储、描述栅格图象数据,包括8bit栅格图象。
· 调色板: 也叫作彩色查对表,它提供图像的色谱。
· 科学数据集: 用来存储和描述多维科学数据陈列。
· Vdata: 是一个框架,用于存储和描述数据表。
· HDF注释: 是文字串,用来描述HDF文件或HDF数据目标。
· Vgroup: 是用来把相关数据目标联系起来。一个Vgroup可以含有其它Vgroup,以及数据目标。任一个HDF目标均可以包括进某个Vgroup中。
3. HDF的文件格式
HDF格式可以被看成一本带目录的多章节书。HDF文件作为“数据书”,每一章包含不同类型的数据元素。HDF文件用“数据目录”列出数据元素。
一个HDF 文件应包括一个文件头,一个或多个描述符块,若干个数据元素。
数据头是用来确定一个文件是否为HDF文件,描述符块存有数据描述符的序号。一个数据描述符和数据元素一起组成了数据对象。数据对象是HDF 的基本结构。
文件头:
文件头占用文件的前4个字节,它由4个ASCII码形式的控制字符组成,每个字符占用一个字节。第一个控制字符是‘N’,第二个是‘C’, 第三个是‘S’,第四为‘A’,即(NCSA).
数据对象:
一个数据对象是由一个数据描述符和一个数据元素组成。数据描述符包含了数据元素的类型、位置、尺度等信息。数据元素是实际的数据资料。HDF 这种数据组织方式可以实现HDF 数据的自我描述。
(1) 数据描述符
所有的数据描述符都为12个字节长,它包含4个区域:标识符(占16-bit),参照数(16-bit),数据偏移量(32-bit),数据长度(32-bit)。
标识符:
数据标识符(tag)是用来确定数据元素区数据类型的。它是16位无符号整型值(1~65535),如果没有与其相对应的数据元素,则tag为DFTGA_NULL(或0)。下面为tag的值的说明:
1~32767——HDF 结构专用
32768~64999——可由用户定义
65000~65535——HDF 规格扩展使用
参照数:
对于HDF 文件中的每个标记符,都有唯一的一个参照数与其相对应。参照数是一个16—bit无符号整型数,在数据对象中一般是不可变的。标记符和参照数相结合确定唯一的数据对象。
数据偏移量和长度:
数据偏移量是指从文件开始位置到数据元素的起始位置所包含的字节数。长度是指整个数据元素区占用字节数。数据偏移量和长度均为32-bit 无符号整型数。
(2) 数据元素
数据元素是数据对象中的裸数据部分。
(3) 在HDF 文件中将数据对象分组
在HDF 文件中通常将含有相关数据的数据对象分为一组。这些数据对象组称为数据集。HDF 用户采用应用界面来处理这些数据集。例如:一套8-bit的图像数据集一般有3个数据对象:一组对象用来描述数据集的成员,一组对象是图像数据,另一组对象则用来描述图像的尺度大小。一个数据对象可以同时属于多个数据集,例如包含在一个栅格图像中的调色板对象,如果它的标识号和参照值也同时包含在另一个数据集描述符中,那么则可以被另一个栅格图像调用。
二、使用hdf5依赖于Python的工具包:h5py
h5接受的数据是矩阵跟mat方法一致,但是具有更强的压缩性能
使用hdf5依赖于Python的工具包:h5py
# -*- coding: utf-8 -*-
import h5py
import numpy as np
#HDF5的写入:
imgData = np.zeros((2,4))
f = h5py.File('HDF5_FILE.h5','w') #创建一个h5文件,文件指针是f
f['data'] = imgData #将数据写入文件的主键data下面
f['labels'] = np.array([1,2,3,4,5]) #将数据写入文件的主键labels下面
f.close() #关闭文件
#HDF5的读取:
f = h5py.File('HDF5_FILE.h5','r') #打开h5文件
# 可以查看所有的主键
for key in f.keys():
print(f[key].name)
print(f[key].shape)
print(f[key].value)
输出结果:
(2, 4)
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
/labels
(5,)
[1 2 3 4 5]
Process finished with exit code 0
import h5py #导入工具包
import numpy as np
#HDF5的写入:
imgData = np.zeros((30,3,128,256))
f = h5py.File('HDF5_FILE.h5','w') #创建一个h5文件,文件指针是f
f['data'] = imgData #将数据写入文件的主键data下面
f['labels'] = range(100) #将数据写入文件的主键labels下面
f.close() #关闭文件
#HDF5的读取:
f = h5py.File('HDF5_FILE.h5','r') #打开h5文件
f.keys() #可以查看所有的主键
a = f['data'][:] #取出主键为data的所有的键值
f.close()
三、使用pandas读取
对h5py包理解不太深刻的话使用 pandas库。
hdf5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的。 使用压缩可以提磁盘利用率,节省空间。 开启压缩也没有什么劣势,只会慢一点点。 压缩在小数据量的时候优势不明显,数据量大了才有优势。 同时发现hdf读取文件的时候只能是一次写,写的时候可以append,可以put,但是写完成了之后关闭文件,就不能再写了, 会覆盖。
另外,为什么单独说pandas,主要因为本人目前对于h5py这个包的理解不是很深入,不知道如果使用该包存pd.DataFrame格式的文件,不像numpy格式文件可以直接存储,因此本人只能依赖pandas自带一些函数进行处理。
2、写入文件
使用函数:pd.HDFStore
import numpy as np
import pandas as pd
####生成9000,0000条数据,9千万条
a = np.random.standard_normal((90000000,4))
b = pd.DataFrame(a)
####普通格式存储:
h5 = pd.HDFStore('/data/stock/test_s.h5','w')
h5['data'] = b
h5.close()
####压缩格式存储
h5 = pd.HDFStore('/data/stock/test_c4.h5','w', complevel=4, complib='blosc')
h5['data'] = b
h5.close()
3、读取文件
使用函数:pd.read_hdf
参数:文件名,key
data=pd.read_hdf('/data/stock/test_c4.h5',key='data')