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简单实现计算过期时间的方法
Jun 09 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
基于python3实现socket文件传输和校验
Jul 28 Python
详解python3中的真值测试
Aug 13 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
python中的print()输出
Apr 12 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
Python 列表推导式需要注意的地方
Oct 23 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与XML的PDF文档生成技术
2006/10/09 PHP
社区(php&&mysql)四
2006/10/09 PHP
main.php
2006/12/09 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
JsDom 编程小结
2011/08/09 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
python中argparse模块用法实例详解
2015/06/03 Python
python2.7实现爬虫网页数据
2018/05/25 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Django文件存储 自己定制存储系统解析
2019/08/02 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
通俗讲解python 装饰器
2020/09/07 Python
python中time.ctime()实例用法
2021/02/03 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
eBay加拿大站:eBay.ca
2019/06/20 全球购物
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
园林毕业生自我鉴定范文
2013/12/29 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏