问题来源:用传统的方法获取.he4文件内容,往往有些信息获取不到。
HDF 是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF 是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。HDF 可以表示出科学数据存储和分布的许多必要条件。HDF 被设计为:
- 自述性:对于一个HDF 文件里的每一个数据对象,有关于该数据的综合信息(元数据)。在没有任何外部信息的情况下,HDF 允许应用程序解释HDF文件的结构和内容。
- 通用性:许多数据类型都可以被嵌入在一个HDF文件里。例如,通过使用合适的HDF 数据结构,符号、数字和图形数据可以同时存储在一个HDF 文件里。
- 灵活性:HDF允许用户把相关的数据对象组合在一起,放到一个分层结构中,向数据对象添加描述和标签。它还允许用户把科学数据放到多个HDF 文件里。
- 扩展性:HDF极易容纳将来新增加的数据模式,容易与其他标准格式兼容。
- 跨平台性:HDF 是一个与平台无关的文件格式。HDF 文件无需任何转换就可以在不同平台上使用。
废话说完了,进入今日重点:
# -*- coding:utf-8 -*-
# author:
from pyhdf.HDF import *
from pyhdf.V import *
from pyhdf.VS import *
from pyhdf.SD import *
import numpy as np
import sys
def describevg(group,refnum):
refs_dict = {}
vg = v.attach(refnum)
print("----------------")
print("name:", vg._name, "class:", vg._class, "tag,ref:",)
print(vg._tag, vg._refnum)
# Show the number of members of each main object type.
print("members: ", vg._nmembers,)
print("datasets:", vg.nrefs(HC.DFTAG_NDG),)
print("vdatas: ", vg.nrefs(HC.DFTAG_VH),)
print("vgroups: ", vg.nrefs(HC.DFTAG_VG))
members = vg.tagrefs()
if "Data Fields"==vg._name:
index = -1
for tag, ref in members:
index += 1
if tag == HC.DFTAG_VH: # vdatas
vd = vs.attach(ref)
nrecs, intmode, fields, size, name = vd.inquire() #
vd.detach()
elif tag == HC.DFTAG_NDG: # datasets
sds = sd.select(sd.reftoindex(ref))
name, rank, dims, type2, nattrs = sds.info() #
sds_group=[i.split(":")[-1] for i in list(sds.dimensions().keys())]
if group==list(set(sds_group))[0]:
refs_dict[sds.info()[0]] = ref
sds.endaccess()
elif tag == HC.DFTAG_VG: # vgroups
vg0 = v.attach(ref)
vg0.detach()
else:
pass
vg.detach()
return refs_dict
if __name__ == '__main__':
Path = r'E:\GraduationDesign\weilesa\OMI-Aura_L1-OML1BIRR_2018m0608t0107-o73916_v003-2018m0608t082245.he4'
hdf = HDF(Path)
sd = SD(Path)
vs = hdf.vstart()
v = hdf.vgstart()
#包含组v.findclass('SWATH Vgroup')
print( "包含组:",v.findclass('SWATH Vgroup'))
group='Sun Volume VIS Swath'#组
keys='Irradiance'
dataset=''
keys_list=[]
ref = -1
while 1:
try:
ref = v.getid(ref)
except:
break
refs_dict = describevg(group,ref)
# print(refs_dict)
if len(refs_dict.keys()) > 1:
keys_list.append(refs_dict[keys])
for keys_li in keys_list:
sds = sd.select(sd.reftoindex(keys_li))
data = np.float64(sds.get())