问题描述
当我使用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)