Python 3.x 如何使用PyTable迭代列名?

Python 3.x 如何使用PyTable迭代列名?,python-3.x,pytables,Python 3.x,Pytables,我使用PyTables存储了一个大矩阵(15000行x2500列),并了解了如何迭代行中的列。在中,我只看到如何手动按名称访问每一行 我有如下专栏: 身份证 X20160730_日10_123a_2 X20160730_日10_123b_1 X20160730_日10_123b_2 ID列值是类似“10692.RFX7”的字符串,但所有其他单元格值都是浮点数。此选择有效,我可以迭代结果行,但看不到如何迭代列并检查其值: from tables import * import numpy d

我使用PyTables存储了一个大矩阵(15000行x2500列),并了解了如何迭代行中的列。在中,我只看到如何手动按名称访问每一行

我有如下专栏:

  • 身份证
  • X20160730_日10_123a_2
  • X20160730_日10_123b_1
  • X20160730_日10_123b_2
ID列值是类似“10692.RFX7”的字符串,但所有其他单元格值都是浮点数。此选择有效,我可以迭代结果行,但看不到如何迭代列并检查其值:

from tables import *
import numpy

def main():
    h5file = open_file('carlo_seth.h5', mode='r', title='Three-file test')
    table = h5file.root.expression.readout

    condition = '(ID == b"10692.RFX7")'
    for row in table.where(condition):
        print(row['ID'].decode())

        for col in row.fetch_all_fields():
            print("{0}\t{1}".format(col, row[col]))

    h5file.close()

if __name__ == '__main__':
    main()
如果我只是用“for col in row”进行迭代,什么都不会发生。如上代码所示,我得到一个堆栈:

10692.RFX7
Traceback (most recent call last):
  File "tables/tableextension.pyx", line 1497, in tables.tableextension.Row.__getitem__ (tables/tableextension.c:17226)
KeyError: b'10692.RFX7'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tables/tableextension.pyx", line 126, in tables.tableextension.get_nested_field_cache (tables/tableextension.c:2532)
KeyError: b'10692.RFX7'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./read_carlo_pytable.py", line 31, in <module>
    main()
  File "./read_carlo_pytable.py", line 25, in main
    print("{0}\t{1}".format(col, row[col]))
  File "tables/tableextension.pyx", line 1501, in tables.tableextension.Row.__getitem__ (tables/tableextension.c:17286)
  File "tables/tableextension.pyx", line 133, in tables.tableextension.get_nested_field_cache (tables/tableextension.c:2651)
  File "tables/utilsextension.pyx", line 927, in tables.utilsextension.get_nested_field (tables/utilsextension.c:8707)
AttributeError: 'numpy.bytes_' object has no attribute 'encode'
Closing remaining open files:carlo_seth.h5...done
10692.RFX7
回溯(最近一次呼叫最后一次):
文件“tables/tableextension.pyx”,第1497行,在tables.tableextension.Row.\uuuu getitem\uuuuuuuuu(tables/tableextension.c:17226)中
密钥错误:b'10692.RFX7'
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“tables/tableextension.pyx”,第126行,在tables.tableextension.get_嵌套_字段_缓存中(tables/tableextension.c:2532)
密钥错误:b'10692.RFX7'
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/read\u carlo\u pytable.py”,第31行,在
main()
文件“/read\u carlo\u pytable.py”,第25行,主文件
打印(“{0}\t{1}”。格式(列,行[col]))
文件“tables/tableextension.pyx”,第1501行,位于tables.tableextension.Row.\uuuu getitem\uuuuuuuuu(tables/tableextension.c:17286)中
文件“tables/tableextension.pyx”,第133行,在tables.tableextension.get_嵌套_字段_缓存中(tables/tableextension.c:2651)
文件“tables/utilsextension.pyx”,第927行,在tables.utilsextension.get_嵌套_字段中(tables/utilsextension.c:8707)
AttributeError:'numpy.bytes\对象没有属性'encode'
关闭其余打开的文件:carlo_seth.h5…完成

您可以按每行中的名称访问列值:

for row in table:
    print(row["10692.RFX7"])
迭代所有列:

names = table.coldescrs.keys()
for row in table:
    for name in names:
        print(name, row[name])

是的,那部分很简单。但是我有数千列,我想迭代它们来检查它们的值,如果它们在某个范围内,我会有选择地打印列名和它们的值。手动按其名称访问它们没有帮助。谢谢!在编辑之后,我看到您添加了迭代。我一直认为您可以从所选行访问它。这很有效。