下述内容根据官方文档翻译而来,官方文档链接如下:
http://docs.h5py.org/en/latest/quick.html
快速入门指南:
h5py包是HDF5二进制数据格式的python接口。
HDF5允许您存储大量数字数据,并且可以轻松地从NumPy操作这些数据。例如,您可以将存储在磁盘上的多TB数据集切片,就像它们是真正的NumPy数组一样。数千个数据集可以存储在一个文件中,按您的需要进行分类和标记。
HDF5文件是两种对象的容器:数据集(类似数组的数据集合)和组(类似文件夹的容器,用于保存数据集和其他组)。使用h5py最基本的要记住的是:
组的工作方式类似于字典,而数据集的工作方式类似于NumPy数组。
假设有人给你发送了一个HDF5文件,mytestfile.hdf5。(要创建此文件,请参阅附录:创建文件。)你需要做的第一件事就是打开文件进行阅读:
>>> import h5py
>>> f = h5py.File('mytestfile.hdf5', 'r')
文件对象是您的起点。这个文件中存储了什么?记得h5py。文件的作用类似于Python字典,因此我们可以检查键:
>>> list(f.keys())
['mydataset']
根据我们的观察,文件中有一个数据集,mydataset。让我们以数据集对象的形式检查数据集:
>>> dset = f['mydataset']
我们得到的对象不是一个数组,而是一个HDF5数据集。与NumPy数组一样,数据集具有形状和数据类型:
>>> dset.shape
(100,)
>>> dset.dtype
dtype('int32')
它们还支持数组样式的切片。这就是从文件中的数据集读取和写入数据的方式:
>>> dset[...] = np.arange(100)
>>> dset[0]
0
>>> dset[10]
10
>>> dset[0:100:10]
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
附录:创建文件
此时,您可能想知道mytestdata是如何被创建的。我们可以通过在初始化文件对象时将模式设置为w来创建文件。其他一些模式是a(用于读/写/创建访问)和r+(用于读/写访问)。文件访问模式及其含义的完整列表在文件对象中。
>>> import h5py
>>> import numpy as np
>>> f = h5py.File("mytestfile.hdf5", "w")
File对象有两个看起来很有趣的方法。其中之一是create_dataset,顾名思义,它创建给定形状和dtype的数据集:
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')
文件对象是一个上下文管理器;所以下面的代码也可以工作:
>>> import h5py
>>> import numpy as np
>>> with h5py.File("mytestfile.hdf5", "w") as f:
>>> dset = f.create_dataset("mydataset", (100,), dtype='i')
组和层次化组织
HDF代表分层数据格式。HDF5文件中的每个对象都有一个名称,它们被安排在POSIX类型的层次结构中,用“/”做分隔。
>>> dset.name
u'/mydataset'
这个系统中的文件夹称为组。我们创建的文件对象本身就是一个组,在本例中是根组,名为“/”。
>>> f.name
u'/'
创建子组是通过适当命名的create_group完成的。但是我们需要先以追加模式打开文件(如果存在读/写,则以其他方式创建):
>>> f = h5py.File('mydataset.hdf5', 'a')
>>> grp = f.create_group("subgroup")
所有组对象也都有create_*方法,比如File:
>>> dset2 = grp.create_dataset("another_dataset", (50,), dtype='f')
>>> dset2.name
u'/subgroup/another_dataset'
顺便说一下,您不必手动创建所有中间组。指定完整路径就可以了:
>>> dset3 = f.create_dataset('subgroup2/dataset_three', (10,), dtype='i')
>>> dset3.name
u'/subgroup2/dataset_three'
组支持大多数Python字典样式的接口。使用项目检索语法检索文件中的对象:
>>> dataset_three = f['subgroup2/dataset_three']
对组进行迭代会提供其成员的名称:
>>> for name in f:
... print name
mydataset
subgroup
subgroup2
成员是否存在的测试也使用名称:
>>> "mydataset" in f
True
>>> "somethingelse" in f
False
甚至可以使用完整路径名:
>>> "subgroup/another_dataset" in f
True
还有熟悉的keys(), values(), items() 和 iter() 方法, 以及 get()。
由于对一个组进行迭代只会产生其直接连接的成员,所以对整个文件进行迭代是使用组方法visit()和visititems()完成的,这两个方法都是可调用的:
>>> def printname(name):
... print name
>>> f.visit(printname)
mydataset
subgroup
subgroup/another_dataset
subgroup2
subgroup2/dataset_three
属性:
HDF5的一个最好的特性是,您可以在它所描述的数据旁边存储元数据。所有组和数据集都支持附加的称为属性的数据位。
属性通过attrs代理对象访问,该对象再次实现dictionary接口:
>>> dset.attrs['temperature'] = 99.5
>>> dset.attrs['temperature']
99.5
>>> 'temperature' in dset.attrs
True