【发布时间】:2019-08-31 04:22:01
【问题描述】:
我有一个包含大约 500 个字符串的列表,我想对照一个包含 25,000 行的 CSV 文件来检查这些字符串。我目前所拥有的似乎陷入了循环。如果它包含我的字符串列表中的任何字符串,我基本上想跳过该行,然后提取其他数据。
stringList = [] #strings look like "AAA", "AAB", "AAC", etc.
with open('BadStrings.csv', 'r')as csvfile:
filereader = csv.reader(csvfile, delimiter=',')
for row in filereader:
stringToExclude = row[0]
stringList.append(stringToExclude)
with open('OtherData.csv', 'r')as csvfile:
filereader = csv.reader(csvfile, delimiter=',')
next(filereader, None) #Skip header row
for row in filereader:
for s in stringList:
if s not in row:
data1 = row[1]
编辑:不是无限循环,而是循环耗时太长。
【问题讨论】:
-
我不明白你是如何陷入无限循环的。我确实看到每次 s 不在行中时覆盖 data1 的问题。这可能会经常发生在每一行,因为您分别检查 stringList 中的每个 s。我会重组你的第二个 for 循环和 if 语句。也许使用 continue 语句。
-
@NielsHenkens 我认为它在几次测试运行后无限循环,即使在 30 多分钟后也没有完成。不要认为它应该花那么长时间......有什么办法让它循环更快?
-
我认为 row 或 row[0] 不只是字符串 s,还可以包含 s?否则,您可以使用类似“if row[x] in stringList:”之类的东西来反转 if 语句。那会加快很多事情。要优化的一件事是,您的“if s not in row:”不正确,不是最优的。现在,如果 stringList 的字符串之一在行中,那么 data1 仍然会更新 499 次。我认为这不是您想要的行为。
-
@NielsHenkens 是的。 Row 不仅仅是字符串 s,而是包含 s。
标签: python python-2.7 loops csv