【问题标题】:Read the properties of HDF file in Python在 Python 中读取 HDF 文件的属性
【发布时间】:2014-08-05 20:08:13
【问题描述】:

我在 pandas 中读取 hdf 文件时遇到问题。到目前为止,我不知道文件的密钥。

在这种情况下如何读取文件 [data.hdf]?而且,我的文件是 .hdf 而不是 .h5 ,它对数据提取有影响吗?

我知道您需要一个“商店中的组标识符”

pandas.io.pytables.read_hdf(path_or_buf, key, **kwargs)

我能够从 pytables 中获取元数据

File(filename=data.hdf, title='', mode='a', root_uep='/', filters=Filters(complevel=0, shuffle=False, fletcher32=False, least_significant_digit=None))
/ (RootGroup) ''
/UID (EArray(317,)) ''
  atom := StringAtom(itemsize=36, shape=(), dflt='')
  maindim := 0
  flavor := 'numpy'
  byteorder := 'irrelevant'
  chunkshape := (100,)
/X Y (EArray(8319, 2, 317)) ''
  atom := Float32Atom(shape=(), dflt=0.0)
  maindim := 0
  flavor := 'numpy'
  byteorder := 'little'
  chunkshape := (1000, 2, 100)

如何通过 pandas 使其可读?

【问题讨论】:

    标签: python pandas hdf5 hdfstore hdf


    【解决方案1】:

    首先(.hdf 或 .h5)没有任何区别。 其次,我不确定大熊猫,但我读到了 HDF5 密钥:

    import h5py
    h5f = h5py.File("test.h5", "r")
    h5f.keys()
    

    h5f.values()
    

    【讨论】:

      【解决方案2】:

      文档是here。但是,您将能够直接阅读您使用 pandas 显示的格式。你需要使用 PyTables 来读取它。即使没有 pandas 使用的元数据,pandas 也可以直接读取 PyTables Table 格式。

      【讨论】:

        【解决方案3】:

        pyhdf 将是 python 中 hdf 文件的替代选项

        您可以从以下位置读取和查看密钥:

        import pyhdf
        hdf = pyhdf.SD.SD('file.hdf')
        hdf.datasets()
        

        希望对你有帮助! 祝你好运

        【讨论】:

          【解决方案4】:

          您可以使用这个简单的功能查看任何 HDF 文件的变量名称(仅适用于科学模式下的变量)

          from pyhdf.SD  import *
          
          def HDFvars(File):
              """
              Extract variable names for an hdf file
              """
              # hdfFile = SD.SD(File, mode=1)
              hdfFile = SD(File, mode=1)
              dsets = hdfFile.datasets()
              k = []
              for key in dsets.keys():
                  k.append(key)
              k.sort()
              hdfFile.end() # close the file
              return k
          

          如果变量不在科学模式下,您可以尝试使用 pyhdf.V 使用以下程序显示其中包含的 vgroups 的内容 任何 HDF 文件。

          from pyhdf.HDF import *
          from pyhdf.V   import *
          from pyhdf.VS  import *
          from pyhdf.SD  import *
          
          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 = 'yourfile.hdf'
          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)
          

          【讨论】:

            猜你喜欢
            • 2014-06-03
            • 2014-09-23
            • 2021-08-16
            • 2019-06-12
            • 2015-03-12
            • 1970-01-01
            • 2023-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多