我有一张桌子:
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
有没有办法在上面的查询中使用条件作为列名? 提前谢谢。
答案 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
我尽力重写了您的榜样。见下文。它显示了几种输入条件的方法。我不够聪明,无法弄清楚如何将您的creteria
和find
变量组合为一个包含字符串和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']