【问题标题】:Is h5py visit and visititems broken?h5py 访问和访问项是否损坏?
【发布时间】:2020-08-12 06:18:17
【问题描述】:

当我使用 h5py visit 或 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文件,还是我坏了?

谢谢

【问题讨论】:

  • 请检查您的 HDF5 文件的 URL。当我尝试它时,它给了我一个“404 not found”错误。关于visititems() 行为,请查看此答案。它显示了visititems() 如何下降多个组:a way to get datasets in all groups

标签: python python-3.x h5py


【解决方案1】:

我在这里找到了你的文件: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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多