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的Django框架中生成CSV文件的方法
Jul 22 Python
python基础知识小结之集合
Nov 25 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
python温度转换华氏温度实现代码
Dec 06 Python
python实现跨年表白神器--你值得拥有
Jan 04 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
js实现简单进度条效果
2020/03/25 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
python中实现延时回调普通函数示例代码
2017/09/08 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
python支付宝支付示例详解
2019/08/22 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
幼儿园美术教学反思
2014/01/31 职场文书
爱情保证书范文
2014/02/01 职场文书
秋天的图画教学反思
2014/05/01 职场文书
员工团队活动方案
2014/08/28 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
学校实习推荐信
2015/03/27 职场文书