2013-11-25 1 views
2

Хотите получить/создать произвольную группу в файле HDF5 db с использованием pytables. файл имеет следующую структуру:Что такое способ доступа к произвольным группам в файле hdf5 с использованием pytables?

db 
    |_ user_00     # Group 
     |_ subjectTable # TableObject 
     |_ subject_00  # GroupObject 

РЕГИСТРАЦИЯ новый предмет означает добавление строки в subjectTable и создать группу с именем субъекта поэтому у меня есть:

def open_db(db_file, mode='r+'): 
     h5f = tables.openFile(db_file, mode) 
     return h5f 

    def register_new_subject(subjectName, user, db_file): 
     # Open db 
     h5f = open_db(db_file) 

     #Create subject 
     subjectGroup = h5f.createGroup(h5f.root.??????????, subjectName) 

     # Add subjectName to user/subjectTable 
     ... 

Как вы можете видеть по вопросительным знакам я не знаю, как продолжить ... потому что группа специфична для пользователя, которого я застрял, новая группа должна быть h5f.root. [user] .subjectName

есть способ делая это?

лучше все еще есть способ pytables сделать это?

для дополнительных очков есть ли питонический способ сделать это?

EDIT: Таким образом, он работает, однако я ненавижу использование eval().

row_str = 'h5f.root.{}'.format(user) 
    where = eval(row_str) 
    subjectGroup = h5f.createGroup(where, subjectName) 

Любой другой способ сделать это?

+0

ли люди понимают эту проблему или я объяснил себя плохо, снова ?? – nico

ответ

2
row_str = 'h5f.root.{}'.format(user) 
    where = eval(row_str) 
    subjectGroup = h5f.createGroup(where, subjectName) 
2

Это очень просто, так как метод createGroup принимает строку пути для где аргумент, и вы можете сделать то, что вы хотите, как:

subjectGroup = h5f.createGroup('/{}'.format(user), subjectName, createparents=True) 

createGroup даже имеет аргумент (как указано выше), чтобы принудительно создать полный путь, если родительский узел (ы) не существует.

Если вам нужна проверка на родительском существования группы, я бы, вероятно, использовать pytables файл-объект getNode для оценки ручки для конкретных узлов

try: 
    where = h5f.getNode('/{}'.format(user)) 
except: 
    raise ValueError('User node does not exist in file') # or exception of your choosing 

subjectGroup = h5f.createGroup(where, subjectName) 
Смежные вопросы