使用Python将搜索列表与csv文件的每一行进行比较

使用Python将搜索列表与csv文件的每一行进行比较,python,search,csv,Python,Search,Csv,我有一个搜索项目列表: search = ("EPP3424", "EPP5423", "EPP4567", Continues... ) 我想检查csv文件的每一行,其中每一行的外观如下: ("1206502", "EPP5423", "97334343") next row... 如果搜索列表中的任何项目出现在csv的行中,请将整行添加到新列表中 问题是我只能让它匹配一个结果,我似乎无法让它正确地循环项目 csvFile = open(fRoot + "\\SearchEPP.csv",

我有一个搜索项目列表:

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()
应该是:

if any(s in row for s in search):

请注意,更好的方法是将
search
转换为集合一次:

search = set(search)
...
然后检查
集合
(而不是
元组
)。
set
的成员资格测试通常是O(1),而元组的成员资格测试是O(n)

if any(r in search for r in row):
甚至:

if search.intersection(row):
   ...
尽管
any
解决方案可能更快(取决于
行的大小以及通过交集创建新集合的开销与生成器表达式的开销)


正如@RocketDonkey所建议的,您的“搜索”列表中可能有新行,这仍然会在更新的代码中给您带来问题。这里有一个修正:

with open(fRoot + "\\EPP.txt", "r") as f:
    search = set(line.rstrip('\n') for line in f)
应该是:

if any(s in row for s in search):

请注意,更好的方法是将
search
转换为集合一次:

search = set(search)
...
然后检查
集合
(而不是
元组
)。
set
的成员资格测试通常是O(1),而元组的成员资格测试是O(n)

if any(r in search for r in row):
甚至:

if search.intersection(row):
   ...
尽管
any
解决方案可能更快(取决于
行的大小以及通过交集创建新集合的开销与生成器表达式的开销)


正如@RocketDonkey所建议的,您的“搜索”列表中可能有新行,这仍然会在更新的代码中给您带来问题。这里有一个修正:

with open(fRoot + "\\EPP.txt", "r") as f:
    search = set(line.rstrip('\n') for line in f)

更好地使用
set((“EPP3424”、“EPP5423”、“EPP4567”、…)
进行(更有效的)匹配。将
all
更改为
any
是否有效?如果有任何值在
search
中,听起来您想标记一行。最好使用
set((“EPP3424”、“EPP5423”、“EPP4567”、…)
进行(更有效的)匹配。将
all
更改为
any
是否有效?如果有任何值在
search
@user765015中,听起来你想标记一行。你检查过你的初始列表以确保不包括换行符吗?@RocketDonkey--这是一个很好的建议。呃,我想如果你的答案不起作用,可能是输入有问题:)@RocketDonkey和mgilson谢谢!,是的,我有新线,现在开始工作了@RocketDonkey——谢谢你的信任投票。实际上我很困惑(但我对我的答案感觉很好,因为MartijnPieters发布了相同的答案)@user765015你检查过你的初始列表以确保不包括新词吗?@RocketDonkey——这是一个很好的建议。呃,我想如果你的答案不起作用,可能是输入有问题:)@RocketDonkey和mgilson谢谢!,是的,我有新线,现在开始工作了@RocketDonkey——谢谢你的信任投票。我其实很困惑(但我对我的答案感觉很好,因为MartijnPieters发布了相同的答案)