如何修复python中“没有NumPy等效的TypeBitfieldID存在”错误

问题描述 投票:0回答:2

我正在使用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
python numpy h5py
2个回答
1
投票

使用此访问功能,我可以获取有关引发此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观众。我不知道pytablespandas是否可以读取此文件。


0
投票

是的,这个文件是一个有趣的好奇心。 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)

不幸的是,我不太了解HDF5pytables来解释发生了什么。有趣的是,其中一些数据集与@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

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.