如何“最佳”检查csv文件中是否出现字符串/单词

时间:2019-02-03 12:52:20

标签: python file csv find

我想检查csv文件中是否出现了特定词(用户通过输入定义)。现在,我想出了一个可以做到这一点的代码,但是由于我是一个初学者,并且不想适应任何“不良习惯”,所以我想知道这是否是最快,最简单和最短的可能性。任何给定的改进都将受到赞赏。

这有效(大多数情况下,请参阅下文),但是整个带有“ yes”变量的内容使我认为必须找到一种更好的方法来解决此问题。

def add(self, name):
    with open(filepath, "r+") as file:
        csvreader = csv.reader(file, delimiter=",", quotechar='"')
        csvwriter = csv.writer(file, delimiter=",", quotechar='"')
        yes = False
        for line in csvreader:
            if name in line[0]:
                yes = True

        if yes:
            print("This ingredient has already been added")
        else:
            csvwriter.writerow([name])

有时会抛出“ IndexError:列表索引超出范围”。我不知道为什么,因为它有时只是这样做。其他时候效果很好...

2 个答案:

答案 0 :(得分:0)

根本没有必要使用csv在文件中查找单词:

def word_in_file(filename, name)
    with open(filename, 'r') as f:
        for line in f:
            if name in line:
                return True
        return False

答案 1 :(得分:0)

您可以进行2种改进:

  1. 找到值并将found标志设置为True后,添加break;没有必要继续扫描文件。
  2. 您的索引错误可能来自空白行。这将是 falsey ,因此我们可以在尝试按索引访问之前添加对此的检查。 if line and name in line[0]:。如果第一个条件不是True,则不会尝试索引。

falsey 而言,它是指将被视为False而不实际上是布尔值的对象。其中包括None和空序列,例如空字符串(''),空列表([])等。空序列不支持索引,即使对于第零个索引也是如此,因此这就是为什么在空白行出现错误的原因。

对于虚假项目,我们不需要与==True进行直接比较(False);确实他们会失败。但是您可以对它们进行布尔类型的检查,例如if some_sequence:if not some_sequence:。另外,and从左到右检查条件,并在找到 falsey 条件后立即停止。对于if line and...,它永远不会尝试索引line,因为它已经知道列表为空。因此,您永远不要尝试获取空列表的索引。