【问题标题】:Compare a searchlist to each row of csv file using Python使用 Python 将搜索列表与 csv 文件的每一行进行比较
【发布时间】:2012-10-25 11:45:29
【问题描述】:

我有一个搜索项目列表:

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()

【问题讨论】:

  • 更好地使用set(("EPP3424", "EPP5423", "EPP4567",...)) 进行(更)有效的匹配。
  • all 更改为any 会起作用吗?如果任何值在search 中,听起来您想标记一行。

标签: python search csv


【解决方案1】:
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)

【讨论】:

  • @user765015 您是否检查了初始列表以确保不包含换行符?
  • @RocketDonkey -- 这是一个很好的建议。
  • 呃,如果你的答案不起作用,那可能是输入有问题:)
  • @RocketDonkey 和 mgilson 谢谢!,是的,我有换行符,现在可以使用!
  • @RocketDonkey -- 感谢您的信任投票。我实际上很困惑(但我对自己的答案感觉很好,因为 MartijnPieters 发布了相同的答案)
猜你喜欢
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多