当使用带负步的itersorted时,为什么PyTables不返回第一行?

时间:2019-06-11 00:52:37

标签: python pytables

我在PyTables中使用了itersorted方法。将步长设置为正值时,将正确返回所有行,但使用负步长值时,不返回第一行。使用负步长值时如何获取完整的行集?

以下是显示问题的测试代码:

import tables


class DBEntry(tables.IsDescription):
    id = tables.Int16Col()


class Test(object):

    def __init__(self, parent = None):
        pass

    def create_db_entries(self):
        db = tables.open_file("py_db_test.h5", mode = "w", title = "db")
        table = db.create_table('/', 'test', DBEntry, "test")
        entry = table.row
        for i in range(0, 5):
            entry['id'] = i
            entry.append()

        table.flush()
        table.cols.id.create_csindex()
        db.close()

    def get_db_entries(self):
        db = tables.open_file("py_db_test.h5", mode = "r")
        entries = db.root.test
        print('ascending (all rows showing)')
        for row in entries.itersorted('id', start = None, stop = None, step = 1):
            print(row['id'])
        print('decending (missing first row)')
        for row in entries.itersorted('id', start = None, stop = None, step = -1):
            print(row['id'])
        db.close()


if __name__ == '__main__':
    test = Test()
    test.create_db_entries()
    test.get_db_entries()

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。我在您的代码中添加了def,以测试table.read_sorted()step=-1的行为。可以按预期工作(您将数组按降序排序:[(4,) (3,) (2,) (1,) (0,)]
请注意,start= and stop=是索引中的位置,而不是行号。请参阅此SO Q&A进行讨论:
  Is it possible to reverse lookup the index position for itersorted in PyTables?

我无法解释为什么itersorted('id', step = -1)缺少第一行,也许是一个错误?

如果确实需要按降序排列的所有元素,则可以将索引值用作行迭代器。将此代码添加到您的def get_db_entries(self):

print('decending (using csi index to order)')
print (entries.cols.id.index.read_indices(step = -1))
for id in entries.cols.id.index.read_indices(step = -1):
    print(entries[id][0])