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
相关推荐
Kai HVZ28 分钟前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神30 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_7482448333 分钟前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人39 分钟前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..42 分钟前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
游客5201 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
每天都要学信号1 小时前
Python(第一天)
开发语言·python
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
咸鱼桨2 小时前
《庐山派从入门到...》PWM板载蜂鸣器
人工智能·windows·python·k230·庐山派
北京_宏哥2 小时前
python接口自动化(四十)- logger 日志 - 下(超详解)
python·前端框架·自动化运维