h5py访问和visititems是否损坏?

问题描述

当我使用h5py访问或visititems时,在文件h5ex_g_visit.h5(从http://mirror.fcaglp.unlp.edu.ar/pub/ftp.hdfgroup.org/HDF5/examples/examples-by-api/files/exbyapi/h5ex_g_visit.h5下载)上都无法正常工作。

一个简单的程序: 导入h5py

def print_objs (name):
   print (name)

fd = h5py.File('h5ex_g_visit.h5')
fd.visit(print_objs)

它打印

group1
group1/dset1
group1/group3
group1/group3/group4
group1/group3/group4/group1
group1/group3/group4/group2

我认为它应该打印

group1
group1/dset1
group1/group3
group1/group3/dset2
group1/group3/group4
group1/group3/group4/group1
group1/group3/group4/group1/group5
group1/group3/group4/group2
group2
group2/dset2
group2/group4
group2/group4/group1
group2/group4/group1/group5
group2/group4/group1/group5/dset1
group2/group4/group1/group5/group3
group2/group4/group1/group2

使用visititems时,您会丢失相同的对象。

我看起来它找到了级别中的第一个组并遵循该路径,而从未回过头来拾取该级别中的其他组和数据集。似乎也没有跌破4个水平。

这对于C中的类似功能正常工作。

这些python方法,HDF5文件还是我坏了?

谢谢

解决方法

我在这里找到您的文件:h5ex_g_visit.h5 没错,这有点奇怪。与在其上运行我的visititems()时可得到的输出相同。我也尝试了Pytables的.iter_nodes()方法。这是遍历所有节点的另一种方式。更糟的是;它陷入了一个循环。

更新:在回答之前,我应该已经用h5dump检查了您的文件。该文件具有硬链接。请参阅以下h5dump的输出:

C:\ > h5dump h5ex_g_visit.h5
HDF5 "h5ex_g_visit.h5" {
GROUP "/" {
   GROUP "group1" {
      DATASET "dset1" {
         DATATYPE  H5T_STD_I32LE
         DATASPACE  SIMPLE { ( 1,1 ) / ( 1,1 ) }
         DATA {
         (0,0): 0
         }
      }
      GROUP "group3" {
         DATASET "dset2" {
            HARDLINK "/group1/dset1"
         }
         GROUP "group4" {
            GROUP "group1" {
               GROUP "group5" {
                  HARDLINK "/group1"
               }
            }
            GROUP "group2" {
            }
         }
      }
   }
   GROUP "group2" {
      HARDLINK "/group1/group3"
   }
}

因此,由于硬链接,“丢失的对象”是重复的。看来h5py足够聪明,可以弄清楚这一点,不再赘述。 (而且,PyTables似乎被链接弄糊涂了。)。

此代码显示了如果没有硬链接,它将如何工作。我创建了一个模仿您的数据架构的HDF5文件。当我在其上运行我的visititems()时,它将在树中输出所有对象和对象名称。参见下面的代码。

我的结论是:“问题”是由于硬链接而不是visit()visititems()引起的。

def visit_func(name,node) :
    print (node.name)

arr = np.arange(100).reshape(10,10)

with h5py.File('SO_63364951.h5','w') as h5w:
     h5w.create_group('group1') 
     h5w['group1'].create_dataset('dset1',data=arr)
     h5w['group1'].create_group('group3')
     h5w['group1/group3'].create_dataset('dset2',data=arr)
     h5w['group1/group3'].create_group('group4')
     h5w['group1/group3/group4'].create_group('group1')
     h5w['group1/group3/group4/group1'].create_group('group5')
     h5w['group1/group3/group4'].create_group('group2')
             
     h5w.create_group('group2') 
     h5w['group2'].create_dataset('dset2',data=arr)
     h5w['group2'].create_group('group4')
     h5w['group2/group4'].create_group('group1')
     h5w['group2/group4/group1'].create_group('group5')
     h5w['group2/group4/group1/group5'].create_dataset('dset1',data=arr)
     h5w['group2/group4/group1/group5'].create_group('group3')
     h5w['group2/group4/group1'].create_group('group2')
      
with h5py.File('SO_63364951.h5','r') as h5r:     
    h5r.visititems(visit_func)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...