有没有办法使用 PyTables 创建一个指定的组,如果它不存在,或者打开一个现有的组,如果它存在?

Is there a way to use PyTables to create a specified group if it does not already exist, or open an existing group if it does?

PyTables 有一个 create_group 方法来创建一个组,但它只在组不存在的情况下有效。

我没有看到 open_group 方法(除了 h5file.root.g1.g2 中的按属性访问方法,它会访问组 /g1/g2);是否有一种干净的方法来创建一个不存在的组,但 return 如果存在则创建现有的组?

Jason,这是一个小代码片段,它演示了 createparents 参数与 create_table() 方法和 File.__contains__(path) 来检查 3 个不同的组名和打印结果。

import tables as tb
import numpy as np
h5f = tb.open_file('SO_54080906.h5','w')

ds_dtype = np.dtype([('a',float),('b',float),('c',float)])
arr = np.array(np.arange(30.0).reshape(10,3))
recarr = np.core.records.array(arr,dtype=ds_dtype)

#create agroup at root level
h5f.create_group(h5f.root, 'agroup')

#create dataset 1 at root.bgroup level
dataset1 = h5f.create_table('/bgroup', 'dataset1',
                            createparents=True, obj=recarr )

for grpname in ['/agroup', '/bgroup' , '/cgroup']:
    if h5f.__contains__(grpname) :
      print ('found path for:', grpname)
    else:
      print ('path doesnt exist for:', grpname)

h5f.close()

输出如下所示:

found path for: /agroup
found path for: /bgroup
path doesnt exist for: /cgroup

我最终使用 createparents 并做了这样的事情:

def createGroup(self, path):
    try:
        return self.hfile.get_node(path)
    except pt.NoSuchNodeError:
        parent, nodename = path.rsplit('/',1)
        if parent == '':
            parent = '/'
        return self.hfile.create_group(parent, nodename, createparents=True)