在 Python 中读取 HDF 文件的属性
Posted
技术标签:
【中文标题】在 Python 中读取 HDF 文件的属性【英文标题】:Read the properties of HDF file in Python 【发布时间】: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 使其可读?
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于在 Python 中读取 HDF 文件的属性的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从 Python 的 HDF5 文件中的复合数据集中读取字段名称?