H5数据读取与处理

[!NOTE] Tips

H5文件是层次数据格式第5代的版本(Hierarchical Data Format,HDF5),它是用于存储科学数据的一种文件格式和库文件。由美国超级计算中心与应用中心研发的文件格式,用以存储和组织大规模数据。

其本身类似于我们的树形文件存储系统

可以看到,通过group容器来组织和管理数据,而数据存放在Dataset里面。

打开其结构可以看到,本数据的标准有三个属性:

  • Attribute
  • Data
  • Global

Global和Attribute都是一些元数据记录,重点关注Data部分,里面有一些处理好的结果。

其数据组织以表结构进行,如果读取,其结果为:

这是一个 144x72 的图像。

现在将通过Python进行读取。

导入必要的模块:

python 复制代码
import os
import h5py
import pandas as pd
import cv2 as cv

这些模块在安装好Anaconda后,直接使用pip命令安装下面这两个:

pip install h5py
pip install opencv-python

来到我们的文件路径,需要对文件树进行遍历,用的是os.walk方法,该方法会返回(上级路径,当前路径下的文件夹,当前路径下的文件)这样一个三元组,其将当前路径下的文件视作叶子节点,所以我们只需要判断当前路径下的文件是否为空,如果不为空,就获取这个文件就行了。

python 复制代码
h5Path=[]
dir_path = r"C:\Users\Administrator\Downloads\20-23"
for dirpath, dirnames, filenames in os.walk(dir_path):
    # 当前路径,路径下的文件夹,文件名
    if filenames!=[]:
        h5Path+=[os.path.join(dirpath,i) for i in filenames]

尝试读取一个文件看看

python 复制代码
for i in h5Path:
    hdf = h5py.File(i, "r")
    print(hdf.keys())
    break

# output
# <KeysViewHDF5 ['Attribute', 'Data', 'Global']>

成功了,然后通过visit方法可以遍历元素,这个用于快速了解hdf5文件的group结构

python 复制代码
hdf.visit(lambda x:print(x))

那么,我们现在以数据XCO2Average为例,进行读取和保存:

python 复制代码
# 获取其中的元素,例如XCO2Average
img=hdf['Data']['latticeInformation']['XCO2Average'][:]

这个结果应该是一个ndarray结构的数据,我们直接用opencv进行读取和保存:

python 复制代码
cv.imshow("img",img)
cv.waitKey(0)
cv.imwrite(r"C:\Users\Administrator\Desktop\新建文件夹\XCO2Average.jpg",img)

可以看到,Data一共有三层结构,我们现在尝试自动化进行读取。

python 复制代码
def getItems(k="Data"):
    res=[]
    keys=hdf.visit(lambda x:res.append(x.split("/")) if x.startswith(k) and len(x.split("/"))==3 else None)
    return res
    

这个函数可以直接获取所有的三层结构。

那么,我们想要获取某个数据,就可以这样啦:

python 复制代码
keys=getItems()
for k in keys:
    try:
	    img=hdf[k[0]][k[1]][k[2]][:]
        path_=os.path.join(p,k[2])
        cv.imwrite(path_+".jpg",img)
        pd.DataFrame(img).to_csv(path_+".csv")
    except:
        pass

[!warning]

为什么这里用Try?因为有部分数据读取失败了,但这部分是缺失该属性导致的,不影响其他属性和数据

python 复制代码
for i in h5Path:
    try:
        hdf=h5py.File(i,"r")
        _savePathDict=(i.split("20-23")[1])[1:-4]
      
        if not os.path.exists(p:=os.path.join(savePath,_savePathDict)):
            os.makedirs(p)
        print(p)
        for k in keys:
            try:
                img=hdf[k[0]][k[1]][k[2]][:]
                path_=os.path.join(p,k[2])
                cv.imwrite(path_+".jpg",img)
                pd.DataFrame(img).to_csv(path_+".csv")
            except:
                pass
    except:
        pass
  • [l] 值得一提的是,os.makedirs会自动处理\,也就是自动创建下级目录,所以这里保持原先的路径位置就好,只不过现在是用文件名创建了一个文件夹,并将读取出来的结果保存在里面。

结果如图所示:


完整代码:

依赖环境:

pip install h5py
pip install opencv-python
python 复制代码
import os
import h5py
import pandas as pd
import cv2 as cv


h5Path=[]
# 这里修正路径
dir_path = r"C:\Users\Administrator\Downloads\20-23"
for dirpath, dirnames, filenames in os.walk(dir_path):
    # 当前路径,路径下的文件夹,文件名
    if filenames!=[]:
        h5Path+=[os.path.join(dirpath,i) for i in filenames]
savePath=r"D:\20-23_toImg"

def getItems(k="Data"):
    res=[]
    hdf.visit(lambda x:res.append(x.split("/")) if x.startswith(k) and len(x.split("/"))==3 else None)
    return res
keys=getItems()

for i in h5Path:
    try:
        hdf=h5py.File(i,"r")
        _savePathDict=(i.split("20-23")[1])[1:-4]
      
        if not os.path.exists(p:=os.path.join(savePath,_savePathDict)):
            os.makedirs(p)
        print(p)
        for k in keys:
            try:
                img=hdf[k[0]][k[1]][k[2]][:]
                path_=os.path.join(p,k[2])
                cv.imwrite(path_+".jpg",img)
                pd.DataFrame(img).to_csv(path_+".csv")
            except:
                pass
    except:
        pass
相关推荐
不去幼儿园10 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书5 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼8 小时前
Python 神经网络项目常用语法
python
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl78122710 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder10 小时前
Python入门(12)--数据处理
开发语言·python
LKID体10 小时前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j