您的位置:首页技术文章
文章详情页

Python存储读取HDF5文件代码解析

【字号: 日期:2022-07-04 13:03:41浏览:15作者:猪猪

HDF5 简介

HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈利组织 HDF 小组维护下继续发展。当前流行的版本是 HDF5。HDF5 拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,如它支持非常多的数据类型,灵活,通用,跨平台,可扩展,高效的 I/O 性能,支持几乎无限量(高达 EB)的单文件存储等,详见其官方介绍:https://support.hdfgroup.org/HDF5/ 。

HDF5 结构

HDF5 文件一般以 .h5 或者 .hdf5 作为后缀名,需要专门的软件才能打开预览文件的内容。HDF5 文件结构中有 2 primary objects: Groups 和 Datasets。

Groups 就类似于文件夹,每个 HDF5 文件其实就是根目录 (root) group’/’,可以看成目录的容器,其中可以包含一个或多个 dataset 及其它的 group。

Datasets 类似于 NumPy 中的数组 array,可以当作数组的数据集合 。

每个 dataset 可以分成两部分: 原始数据 (raw) data values 和 元数据 metadata (a set of data that describes and gives information about other data => raw data)。

+-- Dataset| +-- (Raw) Data Values (eg: a 4 x 5 x 6 matrix)| +-- Metadata| | +-- Dataspace (eg: Rank = 3, Dimensions = {4, 5, 6})| | +-- Datatype (eg: Integer)| | +-- Properties (eg: Chuncked, Compressed)| | +-- Attributes (eg: attr1 = 32.4, attr2 = 'hello', ...)|

从上面的结构中可以看出:

Dataspace 给出原始数据的秩 (Rank) 和维度 (dimension) Datatype 给出数据类型 Properties 说明该 dataset 的分块储存以及压缩情况 Chunked: Better access time for subsets; extendible Chunked & Compressed: Improves storage efficiency, transmission speed Attributes 为该 dataset 的其他自定义属性

整个 HDF5 文件的结构如下所示:

+-- /| +-- group_1| | +-- dataset_1_1| | | +-- attribute_1_1_1| | | +-- attribute_1_1_2| | | +-- ...| | || | +-- dataset_1_2| | | +-- attribute_1_2_1| | | +-- attribute_1_2_2| | | +-- ...| | || | +-- ...| || +-- group_2| | +-- dataset_2_1| | | +-- attribute_2_1_1| | | +-- attribute_2_1_2| | | +-- ...| | || | +-- dataset_2_2| | | +-- attribute_2_2_1| | | +-- attribute_2_2_2| | | +-- ...| | || | +-- ...| || +-- ...|

一个 HDF5 文件从一个命名为 '/' 的 group 开始,所有的 dataset 和其它 group 都包含在此 group 下,当操作 HDF5 文件时,如果没有显式指定 group 的 dataset 都是默认指 '/' 下的 dataset,另外类似相对文件路径的 group 名字都是相对于 '/' 的。

安装

pip install h5py

Python读写HDF5文件

#!/usr/bin/python# -*- coding: UTF-8 -*-## Created by WW on Jan. 26, 2020# All rights reserved.#import h5pyimport numpy as npdef main(): #=========================================================================== # Create a HDF5 file. f = h5py.File('h5py_example.hdf5', 'w') # mode = {’w’, ’r’, ’a’} # Create two groups under root ’/’. g1 = f.create_group('bar1') g2 = f.create_group('bar2') # Create a dataset under root ’/’. d = f.create_dataset('dset', data=np.arange(16).reshape([4, 4])) # Add two attributes to dataset ’dset’ d.attrs['myAttr1'] = [100, 200] d.attrs['myAttr2'] = 'Hello, world!' # Create a group and a dataset under group 'bar1'. c1 = g1.create_group('car1') d1 = g1.create_dataset('dset1', data=np.arange(10)) # Create a group and a dataset under group 'bar2'. c2 = g2.create_group('car2') d2 = g2.create_dataset('dset2', data=np.arange(10)) # Save and exit the file. f.close() ’’’ h5py_example.hdf5 file structure +-- ’/’ | +-- group 'bar1' | | +-- group 'car1' | | | +-- None | | | | | +-- dataset 'dset1' | | | +-- group 'bar2' | | +-- group 'car2' | | | +-- None | | | | | +-- dataset 'dset2' | | | +-- dataset 'dset' | | +-- attribute 'myAttr1' | | +-- attribute 'myAttr2' | | | ’’’ #=========================================================================== # Read HDF5 file. f = h5py.File('h5py_example.hdf5', 'r') # mode = {’w’, ’r’, ’a’} # Print the keys of groups and datasets under ’/’. print(f.filename, ':') print([key for key in f.keys()], 'n') #=================================================== # Read dataset ’dset’ under ’/’. d = f['dset'] # Print the data of ’dset’. print(d.name, ':') print(d[:]) # Print the attributes of dataset ’dset’. for key in d.attrs.keys(): print(key, ':', d.attrs[key]) print() #=================================================== # Read group ’bar1’. g = f['bar1'] # Print the keys of groups and datasets under group ’bar1’. print([key for key in g.keys()]) # Three methods to print the data of ’dset1’. print(f['/bar1/dset1'][:]) # 1. absolute path print(f['bar1']['dset1'][:]) # 2. relative path: file[][] print(g[’dset1’][:]) # 3. relative path: group[] # Delete a database. # Notice: the mode should be ’a’ when you read a file. ’’’ del g['dset1'] ’’’ # Save and exit the file f.close()if __name__ == '__main__': main()

相关代码示例

创建一个h5py文件

import h5pyf=h5py.File('myh5py.hdf5','w')

创建dataset

import h5pyf=h5py.File('myh5py.hdf5','w')#deset1是数据集的name,(20,)代表数据集的shape,i代表的是数据集的元素类型d1=f.create_dataset('dset1', (20,), ’i’)for key in f.keys(): print(key) print(f[key].name) print(f[key].shape) print(f[key].value)

输出:

dset1/dset1(20,)[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

赋值

import h5pyimport numpy as npf=h5py.File('myh5py.hdf5','w')d1=f.create_dataset('dset1',(20,),’i’)#赋值d1[...]=np.arange(20)#或者我们可以直接按照下面的方式创建数据集并赋值f['dset2']=np.arange(15)for key in f.keys(): print(f[key].name) print(f[key].value)

输出:

/dset1[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]/dset2[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]

创建group

import h5pyimport numpy as npf=h5py.File('myh5py.hdf5','w')#创建一个名字为bar的组g1=f.create_group('bar')#在bar这个组里面分别创建name为dset1,dset2的数据集并赋值。g1['dset1']=np.arange(10)g1['dset2']=np.arange(12).reshape((3,4))for key in g1.keys(): print(g1[key].name) print(g1[key].value)

输出:

/bar/dset1[0 1 2 3 4 5 6 7 8 9]/bar/dset2[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]

删除某个key下的数据

# 删除某个key,调用removef.remove('bar')

最后pandsa读取HDF5格式文件

import pandas as pdimport numpy as np# 将mode改成r即可hdf5 = pd.HDFStore('hello.h5', mode='r')# 或者'''hdfs = pd.read_hdf('hello.h5', key='xxx')'''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持好吧啦网。

标签: Python 编程
相关文章: