想要使用pytables在HDF5 db文件中访问/创建任意组。 该文件具有以下结构:
db
|_ user_00 # Group
|_ subjectTable # TableObject
|_ subject_00 # GroupObject
Registring一个新主题意味着向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
有没有办法做到这一点?
还有更好的方法吗?
对于额外的点是否有一种pythonic方式这样做?
修改: 这种方式有效,但我讨厌使用eval()。
row_str = 'h5f.root.{}'.format(user)
where = eval(row_str)
subjectGroup = h5f.createGroup(where, subjectName)
其他任何方式吗?
答案 0 :(得分:3)
row_str = 'h5f.root.{}'.format(user)
where = eval(row_str)
subjectGroup = h5f.createGroup(where, subjectName)
答案 1 :(得分:3)
这很简单,因为createGroup方法接受where参数的路径字符串,你可以完成你想要的:
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)