使用pyhdf时找不到字段

时间:2015-06-23 13:21:26

标签: python hdf pyhdf

我目前正在处理<body> <input type="checkbox" id="one" name="one" onchange="check1()"/> <input type="checkbox" id="two" name="two" onchange="check2()"/> <script> function check1() { if(one.checked) { document.getElementById("two").checked = false; } else { document.getElementById("two").checked = true; } } function check2() { if(two.checked) { document.getElementById("one").checked = false; } else { document.getElementById("one").checked = true; } } </script> </body> 个文件(版本4),并使用HDF模块(http://hdfeos.org/software/pyhdf.php)。

当我使用pyhdf在MATLAB中打开我的一个HDF文件时,我得到以下变量:

nctoolbox

使用python和>> a = ncgeodataset('2011365222309_30199_CS_2B-CLDCLASS_GRANULE_P_R04_E05.hdf') a = ncgeodataset with properties: location: '2011365222309_30199_CS_2B-CLDCLASS_GRANULE_P_R04_E05.hdf' netcdf: [1x1 ucar.nc2.dataset.NetcdfDataset] variables: {16x1 cell} >> a.variables ans = 'StructMetadata.0' '2B-CLDCLASS/Geolocation Fields/Profile_time' '2B-CLDCLASS/Geolocation Fields/UTC_start' '2B-CLDCLASS/Geolocation Fields/TAI_start' '2B-CLDCLASS/Geolocation Fields/Height' '2B-CLDCLASS/Geolocation Fields/Range_to_intercept' '2B-CLDCLASS/Geolocation Fields/DEM_elevation' '2B-CLDCLASS/Geolocation Fields/Vertical_binsize' '2B-CLDCLASS/Geolocation Fields/Pitch_offset' '2B-CLDCLASS/Geolocation Fields/Roll_offset' '2B-CLDCLASS/Geolocation Fields/Latitude' '2B-CLDCLASS/Geolocation Fields/Longitude' '2B-CLDCLASS/Data Fields/Data_quality' '2B-CLDCLASS/Data Fields/Data_status' '2B-CLDCLASS/Data Fields/Data_targetID' '2B-CLDCLASS/Data Fields/cloud_scenario' 我只看到2个变量:

pyhdf

如果有人能帮助我弄清楚这里发生了什么。

3 个答案:

答案 0 :(得分:2)

您正在使用pyhdf.SD打开hdf文件,它只允许您查看科学数据集(SDS)。似乎缺少的字段是Vdata字段,而不是SDS,因此您必须使用pyhdf.HDF和pyhdf.VS单独访问它们。

类似的东西:

from pyhdf.HDF import *
from pyhdf.VS import *

open_file_for_reading_vdata = HDF("your_input_file.hdf", HC.READ).vstart()
vdata = open_file_for_reading_vdata.vdatainfo()
print vdata

有关详细信息,请尝试以下链接:http://pysclint.sourceforge.net/pyhdf/documentation.html

答案 1 :(得分:1)

要在python上读取HDF文件中的所有数据,pyhdf.V的说明包含以下程序,显示任何HDF文件中包含的vgroup的内容

from pyhdf.HDF import *
from pyhdf.V   import *
from pyhdf.VS  import *
from pyhdf.SD  import *

import sys

def describevg(refnum):
    # Describe the vgroup with the given refnum.
    # Open vgroup in read mode.
    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)

    # Read the contents of the vgroup.
    members = vg.tagrefs()

    # Display info about each member.
    index = -1
    for tag, ref in members:
        index += 1
        print "member index", index
        # Vdata tag
        if tag == HC.DFTAG_VH:
            vd = vs.attach(ref)
            nrecs, intmode, fields, size, name = vd.inquire()
            print "  vdata:",name, "tag,ref:",tag, ref
            print "    fields:",fields
            print "    nrecs:",nrecs
            vd.detach()

        # SDS tag
        elif tag == HC.DFTAG_NDG:
            sds = sd.select(sd.reftoindex(ref))
            name, rank, dims, type, nattrs = sds.info()
            print "  dataset:",name, "tag,ref:", tag, ref
            print "    dims:",dims
            print "    type:",type
            sds.endaccess()

        # VS tag
        elif tag == HC.DFTAG_VG:
            vg0 = v.attach(ref)
            print "  vgroup:", vg0._name, "tag,ref:", tag, ref
            vg0.detach()

        # Unhandled tag
        else:
            print "unhandled tag,ref",tag,ref

    # Close vgroup
    vg.detach()
#
# Open HDF file in readonly mode.
# filename = sys.argv[1]
filename = path_FRLK+NameHDF_FRLK
hdf = HDF(filename)

# Initialize the SD, V and VS interfaces on the file.
sd = SD(filename)
vs = hdf.vstart()
v  = hdf.vgstart()

# Scan all vgroups in the file.
ref = -1
while 1:
    try:
        ref = v.getid(ref)
        print ref
    except HDF4Error,msg:    # no more vgroup
        break
    describevg(ref)

以下功能以V模式提取HDF文件的数据

def HDFread(filename, variable, Class=None):
    """
    Extract the data for non-scientific data in V mode of hdf file
    """
    hdf = HDF(filename, HC.READ)

    # Initialize the SD, V and VS interfaces on the file.
    sd = SD(filename)
    vs = hdf.vstart()
    v  = hdf.vgstart()

    # Found the class id
    if Class == None:
        ref = v.findclass('SWATH Vgroup') # The default value for Geolocation fields
    else:
        ref = v.findclass(Class)

    # Open all data of the class
    vg = v.attach(ref)
    # All fields in the class
    members = vg.tagrefs()

    nrecs = []
    names = []
    for tag, ref in members:
        # Vdata tag
        vd = vs.attach(ref)
        # nrecs, intmode, fields, size, name = vd.inquire()
        nrecs.append(vd.inquire()[0])  # number of records of the Vdata
        names.append(vd.inquire()[-1]) # name of the Vdata
        vd.detach()

    idx = names.index(variable)
    var = vs.attach(members[idx][1])
    V   = var.read(nrecs[idx])
    var.detach()
    # Terminate V, VS and SD interfaces.
    v.end()
    vs.end()
    sd.end()
    # Close HDF file.
    hdf.close()

    return array(V)

此程序可用于CloudSat的HDF文件。

答案 2 :(得分:0)

无法访问数据,尽管我可以告诉它看起来这个文件包含netcdf模块无法读取的pyhdf数据。相当于nctoolbox的python似乎是netCDF4。但是,最好使用更高级别的工具xray,它为处理此类文件提供了更方便的数据结构。