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
相关推荐
测开小菜鸟4 分钟前
使用python向钉钉群聊发送消息
java·python·钉钉
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸1 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农1 小时前
Python 继承、多态、封装、抽象
开发语言·python
Python大数据分析@2 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树2 小时前
简单的签到程序 python笔记
笔记·python
Shy9604182 小时前
Bert完形填空
python·深度学习·bert
上海_彭彭2 小时前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
zhongcx013 小时前
使用Python查找大文件的实用脚本
python
yyfhq3 小时前
sdnet
python