我正在使用h5py模块读取.h5文件。我想在这里实现的是打印组中的所有组和所有数据集,而不知道文件的内容结构。 我正在使用visititems函数迭代文件的所有节点。
我的代码一开始工作正常,直到它出错:
TypeError:不存在TypeBitfieldID的NumPy等价物
我是h5py模块的新手所以任何人都可以告诉我为什么会这样?此代码可以很好地启动循环的迭代,但稍后此文件的某些数据集/节点会导致此错误。 据我所知,这个.hf文件中的某些项目(数据集或组)无法正确读取。
链接到我正在使用的.h5文件是: https://cernbox.cern.ch/index.php/s/wk7SN1qt2O7jbrl 这是我的代码:
AWAKE_csv = open('AWAKE_csv.csv', mode='w')
AWAKE_writer = csv.writer(AWAKE_csv, delimiter=',')
AWAKE_writer.writerow(["GROUP", "DATASET", "SIZE", "SHAPE", "TYPE"])
def visitor_func(name, node):
if isinstance(node, h5py.Dataset):
print('Dataset: ' + name)
out = node.dtype
AWAKE_writer.writerow([' ', name, node.size, node.shape, out])
else:
print('Group: ' + name)
# node is a group
AWAKE_writer.writerow([name])
with h5py.File(glob.glob("*.h5")[0],'r') as f:
f.visititems(visitor_func)
我的代码中抛出此错误的行是:
out = node.dtype
使用此访问功能,我可以获取有关引发此node.dtype
错误的所有数据集的信息:
def foo1(name,node):
#print(name)
if isinstance(node, h5py.Dataset):
try:
node.dtype
except TypeError as err:
print(name)
print(node.size, node.shape)
print(err)
我得到了几个值得的屏幕,典型的显示如下:
0 (0,)
No NumPy equivalent for TypeBitfieldID exists
AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK
1 (1,)
No NumPy equivalent for TypeBitfieldID exists
AwakeEventData/GD_BPM.AWAKE.TRIUMF/GlobalAcquisition/posOK
因此,如果您的目标只是访问所有内容并显示您可以使用的信息,请将这样的try/except
添加到您的访问功能中。
其中一个数据集的h5dump
显示为:
2215:~/mypy$ h5dump -d /AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK ../Downloads/1541962108935000000_167_838.h5
HDF5 "../Downloads/1541962108935000000_167_838.h5" {
DATASET "/AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK" {
DATATYPE H5T_STD_B64LE
DATASPACE SIMPLE { ( 1 ) / ( H5S_UNLIMITED ) }
DATA {
(0): 80:17:00:00:00:00:00:00
}
ATTRIBUTE "bitFieldSize" {
DATATYPE H5T_STD_I64LE
DATASPACE SCALAR
DATA {
(0): 14
}
}
}
}
添加print(list(node.attrs.values()))
显示bitFieldSize
属性。
还有其他非python观众。我不知道pytables
或pandas
是否可以读取此文件。
是的,这个文件是一个有趣的好奇心。 HDFView
可以轻松打开或查看数据(即使是麻烦的数据)。我写了一个小的pytables
代码来遍历组层次结构并报告叶子名称。它为几个数据集发出此警告:
DataTypeWarning: Unsupported type for attribute 'exception' in node 'BinningSetting'. Offending HDF5 class: 8
当我在HDFView
中查看这些数据集时,他们会显示出来
Name: exception
Type: 8-bit enun (FALSE=0, TRUE=1)
不幸的是,我不太了解HDF5
或pytables
来解释发生了什么。有趣的是,其中一些数据集与@hpaulj提到的数据集不同。
这是我的代码(警告:它创建了一个输出山):
import tables as tb
h5f = tb.open_file('1541962108935000000_167_838.h5',mode='r')
for grp in h5f.walk_groups('/') :
grp_leaves = grp._v_leaves
if len(grp_leaves) > 0 :
print ('Group: ', grp)
for grp_leaf in grp_leaves :
print ('\tLeaf:', grp_leaf)
前几个违规小组是:
Group: /AwakeEventData/XUCL-SPECTRO/BinningSetting
Group: /AwakeEventData/XUCL-SPECTRO/CameraSettings
Group: /AwakeEventData/XMPP-STREAK/StreakImage
Group: /AwakeEventData/TT43.BPM.430308/Acquisition
Group: /AwakeEventData/TT41.BTV.412426/Image
这有帮助吗?