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


Posted in Python onNovember 25, 2020

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 h5py
import numpy as np

def 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 h5py
f=h5py.File("myh5py.hdf5","w")

创建dataset

import h5py
f=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 h5py
import numpy as np
f=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 h5py
import numpy as np
f=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,调用remove
f.remove("bar")

最后pandsa读取HDF5格式文件

import pandas as pd
import numpy as np

# 将mode改成r即可
hdf5 = pd.HDFStore("hello.h5", mode="r")
# 或者
"""
hdfs = pd.read_hdf("hello.h5", key="xxx")
"""

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中利用xml.dom模块解析xml的方法教程
May 24 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
python删除本地夹里重复文件的方法
Nov 19 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
python中dict()的高级用法实现
Nov 13 Python
tensorflow之并行读入数据详解
Feb 05 Python
Python处理mysql特殊字符的问题
Mar 02 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
python 简单的调用有道翻译
Nov 25 #Python
浅析Python的命名空间与作用域
Nov 25 #Python
重构Python代码的六个实例
Nov 25 #Python
python try...finally...的实现方法
Nov 25 #Python
通过Python pyecharts输出保存图片代码实例
Nov 25 #Python
如何基于Python和Flask编写Prometheus监控
Nov 25 #Python
python3爬虫中多线程进行解锁操作实例
Nov 25 #Python
You might like
PHP二维数组的去重问题解析
2011/07/17 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
总结对比php中的多种序列化
2016/08/28 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
php生成word并下载代码实例
2019/03/15 PHP
PHP中16个高危函数整理
2019/09/19 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
Nodejs对postgresql基本操作的封装方法
2019/02/20 NodeJs
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
Python的Tornado框架实现图片上传及图片大小修改功能
2016/06/30 Python
python中 logging的使用详解
2017/10/25 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
可贵的沉默教学反思
2014/02/06 职场文书
啤酒节策划方案
2014/05/28 职场文书
星级党支部申报材料
2014/05/31 职场文书
承诺书范文
2014/06/03 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
债务授权委托书范本
2014/10/17 职场文书
关于分班的感言
2015/08/04 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript