Как проверить определенное значение в цикле for, а затем завершить его?

#python #csv

#python #csv

Вопрос:

Сегодня я впервые изучаю csv и python. Извините, если я задаю вопрос, на который был дан ответ. Я использую csv dictreader. допустим, у меня есть файл с этими строками:

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

Я буду создавать программу, которая позволит пользователю вводить свое имя. Если оно соответствует данным, оно выдаст true. Я попытался использовать цикл for и оператор if else внутри.

Однако он зацикливает все данные вместо конкретных данных, на которые я смотрю. Например, если я ввожу «Bob», я получаю

 Enter Name:Bob
No record found
No record found
true
  

вместо

 Enter Name:Bob
true
  

Я считаю, что это из-за созданного мной цикла for, но я все еще не уверен, как ему противостоять.

 import  csv

name1 = input("Enter Name:")

filePath = "data.csv"
with open(filePath) as  csvfile:
    reader = csv.DictReader(csvfile)    
    for row in reader:
        if name1 == row['name']:
            print("true")       
            break            
        else:                     
            print("No record found")
  

Ответ №1:

Bob находится в последней строке, поэтому ему приходится перебирать все строки с самого начала, пока он не найдет Bob , а затем оно существует.

Вы, вероятно, хотите просто печатать No records found в конце, а не на каждой итерации. Вот предложение с использованием флага, чтобы запомнить, был ли найден термин или нет:

 import  csv

name1 = input("Enter Name:")
was_found = False

filePath = "data.csv"
with open(filePath) as csvfile:
    reader = csv.DictReader(csvfile)    
    for row in reader:
        if name1 == row['name']:
            print("true")
            was_found = True
            break            

if not was_found:
    # looked at every row and did not find search term
    print("No record found")
  

Ответ №2:

Неправильно помещать No record found сообщение в for цикл.

Все, что вы помещаете в for цикл, может выполняться 0, 1 или много раз. Для No record found сообщения много не имеет смысла.

Поэтому это сообщение должно выходить за пределы for цикла:

 for row in reader:
    if row['name'] == name1:
        print("found it")
        return
print("no record found")
  

Ответ №3:

for while ) циклы в Python на самом деле могут иметь else после них. Это предложение будет введено только в том случае, если цикл не был прерван break . Таким образом, вы можете просто сделать отступ в своем else предложении:

 with open(filePath) as csvfile:
    reader = csv.DictReader(csvfile)    
    for row in reader:
        if name1 == row['name']:
            print("true")       
            break
    else:                     
        print("No record found")