使用pytables访问hdf5文件中的任意组的方法是什么?

时间:2013-11-25 17:56:31

标签: python database hdf5 pytables

想要使用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)

其他任何方式吗?

2 个答案:

答案 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)