使用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发布了相同的答案)