# -*- coding: utf-8 -*-
"""
HDF5文件是一种存放两类对象的容器:dataset和group
Dataset类似于数组的数据集,而group类似文件夹,存放dataset和其他group
使用h5py时要注意:groups类比词典,dataset类比Numpy中的数组
"""
import h5py
import numpy as np
def printname(name):
print(name)
# 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下面
dset = f.create_dataset("mydataset", (100,), dtype='i')
arr = np.arange(10)
num = f.create_dataset("init", data=arr)
num.attrs['temputure'] = 0
print(num.attrs['temputure'])
f.close() # 关闭文件
# HDF5的读取
f = h5py.File('HDF5_FILE.h5','r') # 打开h5文件
f.keys() # 可以查看所有的主键
hdfkey = []
for name in f:
hdfkey.append(name)
a = f['data'][:] # 取出主键为data的所有的键值
print(a.shape, '\n', a.dtype)
f.close()
# 分块存储策略
# 在缺省设置下,HDF5数据集在内存中是连续布局的,也就是按照传统的C序
# Dataset也可以在HDF5的分块存储布局下创建
# 即dataset被分为大小相同的若干块随意地分布在磁盘上,并使用B树建立索引
f = h5py.File('HDF5_FILE.h5','w')
# 块存储,将关键字设为一个元组来指示块的形状
dset1 = f.create_dataset("chunked", (1000, 1000), chunks=(100, 100))
# 自动分块,不必指定块的形状
dset2 = f.create_dataset("autochunk", (1000, 1000), chunks=True)
f.close()
# 分层结构
# “HDF”代表”Hierarchical Data Format”(分层数据格式)
# HDF5文件中group对象类似于文件夹,文件对象本身就是一个group,称为root group
# 创建subgroup是使用create_group的方法实现的,但是需要先用读写模式打开文件
# 创建的grp具有和f一样的方法
f = h5py.File('HDF5_FILE.h5', 'r+')
grp = f.create_group("subgroup")
for name in f:
print(name)
# 遍历一个group内的所有直接和间接成员,可以使用group的visit()和visititerms()方法
# 这些方法需要接收一个回调函数作为参数
subdest = grp.create_dataset("subdataset", (10,), dtype='i')
f.visit(printname)
f.close()
# 属性
# 属性通过attrs成员访问,类似于python中词典格式
评论0