Цель состоит в том, чтобы постоянно запрашивать ввод данных пользователем и искать имя в CSV-файле, возвращать строку, в которой оно есть, и, если имени нет в файле, добавлять адрес для имени, введенного пользователем, в новую строку в файле. Проблема в том, что оператор else полностью игнорируется и сценарий каждый раз запускает обе части.

import csv

b = [None] * 2

while True:
    a = input("Enter name: ")
    with open("addresses.csv") as f_obj:
        reader = csv.reader(f_obj, delimiter=":")
        for row in reader:
            if a in row:
                print(row)
            else:
                with open("addresses.csv", "a+", newline="") as f:
                    writer = csv.writer(f, delimiter=":")
                    temp = input(f"Enter {a}'s address:")
                    b[0] = a
                    b[1] = temp
                    writer.writerow(b)

Желаемое поведение:

content of addresses.csv before running script: 
name:street1
```
user input: name
output: name:street1

user input: test
output: "Enter test's address: "
user input: street2
```
content of addresses.csv after running script: 
name:street1
test:street2
-2
pythonNoob 22 Фев 2021 в 02:59

1 ответ

Лучший ответ

Учтите, что каждая строка соответствует отдельной записи. Прямо сейчас ваш оператор if-else выполняется для каждой строки. Итак, допустим, ваш файл выглядит так:

Alice,Address1
Bob,Address2

Если мы ищем Алису, первая итерация цикла for будет проходить по пути if. Но, поскольку мы не прекращаем поиск (с чем-то вроде break), мы также переходим ко второй строке. Алиса не Боб, поэтому мы выбираем путь else. Обратите внимание, что если бы у нас было 3 записи в файле, мы бы дважды запустили оператор else. Аналогичная проблема возникает, если мы искали Боба вместо Алисы.

Мое предложенное (и непроверенное) исправление приведено ниже.

import csv

b = [None] * 2

while True:
    a = input("Enter name: ")
    with open("addresses.csv") as f_obj:
        reader = csv.reader(f_obj, delimiter=":")
        found = False
        for row in reader:
            if a in row:
                print(row)
                found = True
                break
        if not found:
            with open("addresses.csv", "a+", newline="") as f:
                writer = csv.writer(f, delimiter=":")
                temp = input(f"Enter {a}'s address:")
                b[0] = a
                b[1] = temp
                writer.writerow(b)
0
Dillon 22 Фев 2021 в 00:13