有没有办法使用 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)
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)