【问题标题】:hdf5 'Unable to open object (bad object header version number)' error handlinghdf5 'Unable to open object (bad object header version number)' 错误处理
【发布时间】:2021-12-27 17:42:18
【问题描述】:

我正在从一个显然有问题的 h5 文件中读取数据。它由数百个循环组成(每个循环有 30 个成员),其中一个循环(#100)是空的(组存在但不包含组成员)。

当迭代循环时,到达循环的那一刻我得到一个“无法打开对象(错误的对象标头版本号)” 当达到这个周期时,如何防止我的脚本停止?

我尝试提前检查每个组是否确实有成员,以便从迭代中排除空循环,但我得到了一个 runtimeError 已经尝试这样做:

g = h5py.File('file.h5', 'r')
g['cycle_100']
*** RuntimeError: Can't determine # of objects (bad symbol table node signature)

寻找解决方案我 found 只能处理异常而不是错误 - 除了在错误发生后手动排除此循环并再次运行脚本之外,我无能为力吗?这很容易,但每当我收到错误的文件时,我都必须再做一次。

任何我应该搜索的指针将不胜感激我是初学者。

【问题讨论】:

    标签: python runtime-error hdf5


    【解决方案1】:

    需要明确的是,访问没有数据集('members')的组('cycles')不会导致错误。错误消息 (bad symbol table node signature) 听起来像是文件中的某些内容已损坏。这些类型的错误很难重现,因此没有文件很难诊断。也就是说,这里有一些想法可以尝试。

    首先,当你运行这个 Python/h5py 代码时会发生什么:

    with h5py.File('file.h5', 'r') as g:
        print(len(g['cycle_1'].keys())) # get number of datasets for a "good" group
        print(len(g['cycle_100'].keys())) # get number of datasets for the "bad" group
    

    我预计您会在 g['cycle_100'] 上遇到类似的错误,但值得一试。

    您可以使用 HDF5 实用程序 h5lsh5dump 检查您的文件。我认为它们是通过 h5py 交付的。我在 Python 的 Library\bin 文件夹中找到了它们。 (如果没有,您将需要安装 HDF5 来获取它们。)您在命令行上运行这些命令(而不是作为 Python 代码)。

    • 使用h5ls 命令获取所有组和数据集的列表 名称和形状,像这样:h5ls -r file.h5
    • 使用h5dump 命令列出所有组和数据集的标头信息,如下所示:h5dump -H file.h5
    • 这两个命令都有您可能想要调查的其他选项。输入不带任何参数的命令名称以获得“帮助”输出。

    两个实用程序的简单文件输出示例如下所示。 group1 组有 5 个数据集,group2 没有数据集。

    E:[.\StackOverflow]->h5ls -r file.h5
    /                        Group
    /group1                  Group
    /group1/dset_01          Dataset {1, 100, 20, 20}
    /group1/dset_02          Dataset {1, 100, 20, 20}
    /group1/dset_03          Dataset {1, 100, 20, 20}
    /group1/dset_04          Dataset {1, 100, 20, 20}
    /group1/dset_05          Dataset {1, 100, 20, 20}
    /group2                  Group
    
    E:[.\StackOverflow]->h5dump -H file.h5
    HDF5 "file.h5" {
    GROUP "/" {
       GROUP "group1" {
          DATASET "dset_01" {
             DATATYPE  H5T_IEEE_F64LE
             DATASPACE  SIMPLE { ( 1, 100, 20, 20 ) / ( 1, 100, 20, 20 ) }
          }
          DATASET "dset_02" {
             DATATYPE  H5T_IEEE_F64LE
             DATASPACE  SIMPLE { ( 1, 100, 20, 20 ) / ( 1, 100, 20, 20 ) }
          }
          DATASET "dset_03" {
             DATATYPE  H5T_IEEE_F64LE
             DATASPACE  SIMPLE { ( 1, 100, 20, 20 ) / ( 1, 100, 20, 20 ) }
          }
          DATASET "dset_04" {
             DATATYPE  H5T_IEEE_F64LE
             DATASPACE  SIMPLE { ( 1, 100, 20, 20 ) / ( 1, 100, 20, 20 ) }
          }
          DATASET "dset_05" {
             DATATYPE  H5T_IEEE_F64LE
             DATASPACE  SIMPLE { ( 1, 100, 20, 20 ) / ( 1, 100, 20, 20 ) }
          }    
       }
       GROUP "group2" {
       }
    }
    }
    
    E:[.\StackOverflow]->
    

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 2016-09-05
      • 2022-12-02
      • 2014-02-08
      • 2013-01-09
      • 1970-01-01
      • 2022-08-14
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多