Есть ли способ использовать PyTables для создания указанной группы, если она еще не существует, или открыть существующую группу, если она существует? - PullRequest
0 голосов
/ 07 января 2019

PyTables имеет метод create_group для создания группы, но он работает только в том случае, если группа еще не существует.

Я не вижу open_group метода (кроме подхода с доступом по атрибутам, как в h5file.root.g1.g2, который бы осуществлял доступ к группе /g1/g2); Есть ли чистый способ создать группу, если она не существует, но вернуть существующую группу, если она существует?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

В итоге я использовал 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)
0 голосов
/ 08 января 2019

Джейсон, вот небольшой фрагмент кода, который демонстрирует как аргумент 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
...