#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")