Как лучше всего проверить, встречается ли строка / слово в CSV-файле - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу проверить, встречается ли в csv-файле определенное слово (определяемое пользователем посредством ввода).Теперь я разработал код, который делает это, но, поскольку я новичок и не хочу приспосабливаться к каким-либо «вредным привычкам», мне интересно, является ли это самой быстрой, простой и самой короткой возможностью.Любые улучшения приветствуются.

Это работает (в основном, см. Ниже), но все это с переменной «да» заставляет меня думать, что должен быть лучший способ решить эту проблему.

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: list index out of range».Я понятия не имею, почему, потому что он делает это иногда.В остальное время работает нормально ...

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Есть 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, поскольку он уже знает, что список пуст.Следовательно, вы никогда не пытаетесь взять индекс пустого списка.

0 голосов
/ 03 февраля 2019

Нет смысла использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...