【问题标题】:"why can't I use the Python "in" operator to tell if a word is present in a CSV file?"“为什么我不能使用 Python 的“in”运算符来判断一个单词是否存在于 CSV 文件中?”
【发布时间】:2017-03-21 15:46:20
【问题描述】:

我将字符串拆分为单词,并且对于每个单词,我都会遍历 CSV 文件的每一行,以检查该单词是否存在于任何行中。如果存在我想打印这一行

import csv
tempfile = open("word.csv",'r')

listtext = csv.reader(tempfile)

sti = "this is not a very good string"

sss =  sti.split(" ")

print sss

for word in sss:
    print word
    for x in listtext:
        if str(word) in x:
            print x

这是我得到的输出

['this', 'is', 'not', 'a', 'very', 'good', 'string']

this

is

not

a

very

good

string

这是我想要的输出

['proud', 'flesh', '', '', '', '', '', '', '', '', '', '', '', 'n', '-0.38925']
['proud', 'of', '', '', '', '', '', '', '', '', '', '', '', 'a', '-0.03118']
['proud', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '0.5']
['tarquin', 'the', 'proud', '', '', '', '', '', '', '', '', '', '', 'n', '-0.07997']

我用这段代码得到这个输出

for x in list-text:
    if "proud" in x:
        print x

【问题讨论】:

  • ...和?此输出与您期望的结果有何不同,为什么您期望自己做什么? (即,对于阅读代码并认为输出正是应有的输出的人,您能解释一下为什么这里有问题/问题吗?)
  • 我们不知道您的 csv 内容...是吗?
  • 我还建议让您的问题的代码自包含——现在,如果没有 word.csv 的副本,有人无法自己测试它。
  • ...顺便说一句,作为一项规则,标题应该足够具体,以至于它不能适用于除您之外的任何其他人的问题——可能网站上所有问题的 50% 都可以使用标题“为什么这段代码没有按预期工作?”,这使得让某人告诉他们是否有同样的问题毫无价值(因此您的问题的答案是否也适用于他们);如果您的问题是,例如,“为什么我不能使用 Python 的“in”运算符来判断 CSV 文件中是否存在某个单词?”,这将是具体且有帮助的传达意图。
  • 等一下。您为什么不再次发布示例 csv 文件?我错过了。

标签: python


【解决方案1】:

CSV 阅读器是 Python 中的 生成器:每当被要求输入下一项时,它都会产生行,直到所有这些行都被消耗完。一旦它们被消耗,它就完成了并且没有更多内容:你不能通过第二次循环运行同一个生成器并从中获得更多结果。

但是,通过首先遍历要匹配的单词列表,然后然后针对 CSV 文件的内容,您正试图做到这一点——效果是 CSV 文件只会被读取一次,与字符串中的第一个单词(“this”)匹配,但不会与其他任何单词匹配。

如果你想创建一个可以多次迭代的对象,你会想要这样的东西:

listtext = list(csv.reader(tempfile))

或者你可以反转你的循环:首先迭代输入文件的行,然后然后对你想要匹配的行。

【讨论】:

    【解决方案2】:

    Charles 回答的问题是,一旦您使用for x in listtext: 旋转通过 csv,csv 行阅读器已经用尽,并且下一次通过外循环时没有任何东西可以处理。

    每当您发现自己多次浏览列表时,问问自己是否有某种方法可以将其编入索引。您可以使用dict,它使用一个单元格作为键,并使用该单元格作为值出现的行列表。 collections.defaultdict 通过在首次访问时在字典中创建项目来为您做一些簿记。您的代码可能是

    import csv
    import collections
    
    # index csv rows by column
    csv_index = collections.defaultdict(list)
    with open("word.csv", "rb") as tempfile:
        for row in csv.reader(tempfile):
            for col in row:
                csv_index[col].append(row)
    
    # sample to check
    sti = "this is not a very good string"
    sss =  sti.split(" ")
    print sss
    
    # lookup words from sample and print
    for word in sss:
        print word
        for row in csv_index[word]:
            print(row)
    

    这个输出

    ['this', 'is', 'not', 'a', 'very', 'good', 'string']
    this
    is
    not
    a
    ['proud', 'of', '', '', '', '', '', '', '', '', '', '', '', 'a', '-0.03118']
    ['proud', '', '', '', '', '', '', '', '', '', '', '', '', 'a', '0.5']
    very
    good
    string
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多