Цикл While не прерывается, когда условие находится внутри цикла for

#python #csv

#python #csv

Вопрос:

У меня есть код, который просит пользователя ввести свое имя. Если имя будет в файле csv, оно выведет значение true, а затем прервется. Если данные не имеют входных данных, цикл будет продолжаться. Однако, даже когда мой вывод правильный, он просто продолжает цикл, как показано ниже:

 Enter Name:Bob
true
Enter Name:
  

Это мои данные csv:

 {'age': '20', 'name': 'Alice'}
{'age': '21', 'name': 'Freddie'}
{'age': '17', 'name': 'Bob'}
  

Ниже приведен мой код:

     import  csv

filePath    =   "data.csv"
with    open(filePath)  as  csvfile:
    reader  =   csv.DictReader(csvfile)    
    was_found = False

    while True:
        nam1 = input("Enter Name:")

        for row in  reader:        

            if nam1 == row['name']:
                print("true")
                break
        if nam1 == "":
            print('Empty input, please enter again')
  

Комментарии:

1. почему вы используете строку [‘id’], если ключ называется ‘name’?

2. отредактировано по имени.

Ответ №1:

break ограничивается непосредственным внешним циклом. Таким образом, это нарушает for не while

Ответ №2:

Один совет по исправлению: используйте переменную и проверяйте переменную в конце цикла. Вероятно, это значение вашей переменной was_found

 import  csv

filePath    =   "data.csv"
with    open(filePath)  as  csvfile:
    reader  =   csv.DictReader(csvfile)    
    was_found = False
    have_to_break = False

    while True:
        nam1 = input("Enter Name:")

        for row in  reader:        

            if nam1 == row['id']:
                print("true")
                have_to_break = True
        if nam1 == "":
            print('Empty input, please enter again')

        if have_to_break:
            break
  

Я почти уверен, что смогу избежать значения while True, выполните строку for в reader, затем получите then input («name»)

Ответ №3:

Другой способ сделать это — вернуть значение из функции:

 import  csv

def get_name(reader):
    while True:
        nam1 = input("Enter Name:")

        if nam1 == "":
                print('Empty input, please enter again')
                continue

        for row in reader:
                if nam1 == row['name']:
                        print("true")
                        return nam1

filePath = "data.csv"
with open(filePath) as csvfile:
        reader = csv.DictReader(csvfile)
        was_found = False
        nam1 = get_name(reader)