1. HDF5简介
Hierarchical Data Format(分层数据结构)是一种对大量数据进性组织和存储的文件格式。经历了20多年的发展,HDF格式的最新版本为HDF5,HDF5包含了数据模型,库和文件格式标准。
特点:便捷有效,移植性强,灵活可扩展
一定要在操作结束之后关闭对象。因为之前的操作只是操作的流程,并不是真正执行操作,只有真正关闭对象才是真正发出对对象进行的修改。
HDF5文件结构:
HDF5文件格式:
HDF5结构模型:
每一个dataset包含两部分的数据,Metadata和Data。其中,Metadata包含Data的相关信息,而Data则包含数据本身。
内置数据类型
C类型 | HDF5内存类型 | HDF5文件类型1 |
---|---|---|
Integer : | ||
int | H5T_NATIVE_INT | H5T_STD_I32BE or H5T_STD_I32LE |
short | H5T_NATIVE_SHORT | H5T_STD_I16BE or H5T_STD_I16LE |
long | H5T_NATIVE_LONG | H5T_STD_I32BE, H5T_STD_I32LE, H5T_STD_I64BE or H5T_STD_I64LE |
long long | H5T_NATIVE_LLONG | H5T_STD_I64BE or H5T_STD_I64LE |
unsigned int | H5T_NATIVE_UINT | H5T_STD_U32BE or H5T_STD_U32LE |
unsigned short | H5T_NATIVE_USHORT | H5T_STD_U16BE or H5T_STD_U16LE |
unsigned long | H5T_NATIVE_ULONG | H5T_STD_U32BE, H5T_STD_U32LE, H5T_STD_U64BE or H5T_STD_U64LE |
unsigned long long | H5T_NATIVE_ULLONG | H5T_STD_U64BE or H5T_STD_U64LE |
Float : | ||
float | H5T_NATIVE_FLOAT | H5T_IEEE_F32BE or H5T_IEEE_F32LE |
double | H5T_NATIVE_DOUBLE | H5T_IEEE_F64BE or H5T_IEEE_F64LE |
4 开始干HDF5:
一般操作一个HDF5对象的步骤:
- 打开这个对象
- 对这个对象进行操作
- 关闭这个对象
4.1 文件创建,打开和关闭
import h5py
# 以写入方式打开文件
# r 只读,文件必须已存在
# r+ 读写,文件必须已存在
# w 新建文件,若存在则覆盖
# w- or x 新建文件,若存在则报错
# a 若存在则读写,若不存在则创建(默认)
file = h5py.File('file.h5', 'w')
file.close()
4.2 Group (群)的建立
Python中将文件树表述成一个dict,keys值是groups成员的名字,values是成员对象(groups或者是datasets)本身。
文件对象本身作为root group.
import h5py
f = h5py.File('foo.hdf5', 'w')
f.name # output = '/'
[k for k in f.keys()] # output = []
创建一个group
# 1. 相对地址方法
grp = f.create_group('bar')
grp.name
subgrp = grp.create_group('baz')
subgrp.name
# 2. 绝对地址创建多个group
grp2 = f.create_group('/some/long/path')
grp2.name # output = '/some/long/path'
grp3 = f['/some/long']
grp3.name # output = '/some/long'
# 3. 删除一个group
del f['bar']
# 最终一定记得关闭文件才能保存
f.close()
4.3 Dataset(数据集)的建立
H5py中的dataset很类似于Numpy中的array,但支持一些列透明(针对连续存储的选择操作对分块存储同样有效)的存储特性,还支持分块,压缩和错误校验。
新的数据集可以通过:
- group.create_dataset()
- group.require_dataset()记忆性创建
已经存在的数据可以通过群访问:
- dset = group['dset_name']
import h5py
import numpy as np
f = h5py.File('file.h5', 'w')
# 创建数据集
dataset = group_create_dataset(name,
shape = None,
dtype = None,
data = None)
dset = f.create_dataset('default', (100,))
dset = f.create_dataset('ints', (100,), dtype = 'i8')
dset = f.create_dataset('init', data = np.arange(100))
# 读取数据集可以采用索引操作
read_dset = f['default']
# 数据集的删除。注意这样做只能是删除链接,但文件中所申请的空间是无法收回的
f.__delitem__('inits') # version1
del f['init'] # version2
f.close()
4.4 数据集读取与子集索引(subsetting)
h5py采用numpy的切片语法来读写文件中的数据集。以下是能够被识别的用法:
- 索引
- 切片(比如:[:]or[0:10])
- 域名,在符合数据中使用
- 最多一个省略(Ellipsis),即(...),对象
本文中,使用h5py模块来使用HDF5