在PyTables 3中使用字符串进行查询

时间:2018-04-03 01:55:24

标签: pytables

我有一张桌子:

h5file=open_file("ex.h5", "w")
class ex(IsDescription):
    A=StringCol(5, pos=0)
    B=StringCol(5, pos=1)
    C=StringCol(5, pos=2)
table=h5file.create_table('/', 'table', ex, "Passing string as column name")
table=h5file.root.table
rows=[
    ('abc', 'bcd', 'dse'),
    ('der', 'fre', 'swr'),
    ('xsd', 'weq', 'rty')
]
table.append(rows)
table.flush()

我正在尝试按以下方式进行查询:

find='swr'
creteria='B'
if creteria=='B':
    condition='B'
else:
    condition='C'
value=[x['A'] for x in table.where("""condition==find""")]
print(value)

它返回:

ValueError:没有列参与条件condition==find

有没有办法在上面的查询中使用条件作为列名? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

是的,您可以使用Pytables .where()根据条件进行搜索。问题在于您如何构建table.where(condition)的查询。请参见Pytables Users Guide中Table.where()下有关字符串的注释:

  

当查询条件包含字符串文字时,应格外小心。 ... Python 3字符串是unicode对象。
  在Python 3中,“条件”的定义应如下所示:
  condition = 'col1 == b"AAAA"'
  原因是在Python 3中,“条件”意味着将字节字符串(“ col1”内容)与Unicode文字(“ AAAA”)进行比较。

查询的最简单形式如下所示。它返回匹配条件的行的子集。注意对字符串和unicode使用单引号和双引号:

query_table = table.where('C=="swr"') # search in column C

我尽力重写了您的榜样。见下文。它显示了几种输入条件的方法。我不够聪明,无法弄清楚如何将您的creteriafind变量组合为一个包含字符串和Unicode字符的单个condition变量。

from tables import *
class ex(IsDescription):
    A=StringCol(5, pos=0)
    B=StringCol(5, pos=1)
    C=StringCol(5, pos=2)

h5file=open_file("ex.h5", "w")

table=h5file.create_table('/', 'table', ex, "Passing string as column name")
## table=h5file.root.table
rows=[
    ('abc', 'bcd', 'dse'),
    ('der', 'fre', 'swr'),
    ('xsd', 'weq', 'rty')
]
table.append(rows)
table.flush()
find='swr'
query_table = table.where('C==find')
for row in query_table :
  print (row)
  print (row['A'], row['B'], row['C'])

value=[x['A'] for x in table.where('C == "swr"')]
print(value)

value=[x['A'] for x in table.where('C == find')]
print(value)

h5file.close() 

输出如下所示:

/table.row (Row), pointing to row #1
b'der' b'fre' b'swr'
[b'der']
[b'der']