2013-11-25 44 views
2

想要使用pytables在HDF5數據庫文件中訪問/創建任意組。 該文件具有以下結構:什麼是使用pytables訪問hdf5文件中的任意組的方法?

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。[用戶] .subjectName

有沒有辦法這樣做?

更好的是有沒有pytables的方式做到這一點?

加分是否有pythonic方式做到這一點?

編輯: 這種方式,但我討厭使用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方法接受了該argument的路徑字符串,就可以完成你想要的是:

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) 
相關問題