我有一个搜索项列表:
search = ("EPP3424", "EPP5423", "EPP4567", Continues... )
我想检查csv文件的每一行,其中每行看起来像这样:
("1206502", "EPP5423", "97334343")
next row...
如果搜索列表中的任何项目出现在csv的行中,请将整行添加到新列表中。
问题是我可以让它只匹配一个结果,我似乎无法让它正确循环项目。
csvFile = open(fRoot + "\\SearchEPP.csv", 'r')
try:
csvReader = csv.reader(csvFile)
for row in csvReader:
if all(s in row for s in search):
print "Match"
allEPP.append(row)
else:
print "no match"
finally:
csvFile.close()
Python 2.6,Windows 7
更新:
这是我根据您的回复尝试做的,仍然只返回一条记录。
f = open(fRoot + "\\EPP.txt", "r")
search = list()
for row in f:
search.append(row)
search = set(search)
#search = ("EPP2383", "EPP2384")
allEPP = list()
csvFile = open(fRoot + "\\SearchEPP.csv", 'r')
try:
csvReader = csv.reader(csvFile)
for row in csvReader:
if any(r in search for r in row):
print "Match"
allEPP.append(row)
else:
print "."
finally:
csvFile.close()
答案 0 :(得分:3)
if all(s in row for s in search):
应该是:
if any(s in row for s in search):
请注意,更好的方法是将search
转换为一次设置:
search = set(search)
...
然后检查set
(而不是tuple
)。 set
的成员资格测试通常为O(1),而元组的成员资格测试为O(n)。
if any(r in search for r in row):
甚至:
if search.intersection(row):
...
虽然any
解决方案可能更快(取决于row
有多大,以及通过交集创建新集合的开销与生成器的开销相比是多少表达)。
正如@RocketDonkey所建议的那样,您的“搜索”列表中可能有换行符,这仍然会导致您更新的代码出现问题。这是一个修复:
with open(fRoot + "\\EPP.txt", "r") as f:
search = set(line.rstrip('\n') for line in f)