【问题标题】:Skip Row In CSV If Contains Strings From List如果包含列表中的字符串,则跳过 CSV 中的行
【发布时间】: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


【解决方案1】:

你可以试试这样的。

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)

data1 = [] # Right now you are overwriting your data1 every time. I don't know what you want to do with it, but you could for exmaple add all row[1] to a list data1
with open('OtherData.csv', 'r')as csvfile:
    filereader = csv.reader(csvfile, delimiter=',')
    next(filereader, None) #Skip header row
    for row in filereader:
        found_s = False
        for s in stringList:
            if s in row:
                found_s = True
                break
        if not found_s:
            data1.append(row[1]) # Add row[1] to the list is no element of stringList is found in row. 

仍然可能不会有很大的性能改进,但至少 for 循环 for s in stringList: 现在将在找到 s 后停止。

【讨论】:

    【解决方案2】:

    根据 Niels 的说法,我会更改 2 循环并遍历行本身并检查当前行条目是否在“坏”列表中:

    for row in filereader:
        for s in row:
           if s not in stringlist:
               data1 = row[0]
    

    我也不知道你想用 data1 做什么,但是当一个项目不在 stringList 中时,你总是会更改对象引用。 您可以使用列表将项目添加到带有data1.append(item)的列表中

    【讨论】:

    • 你的回答不是我的意思。不知道行的确切外观,但此解决方案仅适用于行中的一项正是您要在 stringList 中检查的值(而不是包含 stringList 中不需要的子字符串的一部分的较长字符串)。而且您还循环遍历行中的所有项目,并且仍然为不在 stringList 中的行中的每个项目更新 data1。
    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多