Ваша ошибка (в основном) заключается в том, что вы сравниваете имя ввода с последней строкой файла. Это потому, что вы проверяете if parts[0] == name
, где parts = line.split()
. Это означает, что parts
всегда принадлежит последней строке файла - независимо от того, какое имя предоставлено.
Чтобы исправить это, я бы начал с лучшего способа хранения ваши данные. Прямо сейчас вы просто сохраняете имена в списке. Но как насчет оценок? Я думаю, что лучшим решением было бы использовать dict
. Итак, начнем с изменения на:
names = {} # instead of []
Теперь вы хотите заполнить этот диктат именами в качестве ключей (сохраняет лог c аналогично списку) и списком оценок в качестве значения для этого ключ. Таким образом, синтаксический анализ вашего файла может выглядеть следующим образом:
for line in file_name:
elements = line.split()
names[elements[0]] = elements[1:]
# names now look like: {'Anthony': ['85', '85', '85', '85'], 'Conor': [...], ... }
Теперь другое дело, что вы вызываете функцию check_name
, но затем делаете еще одну проверку в process_marks
. Это кажется излишним. Я бы изменил функцию ceck_name
, чтобы она возвращала логическое значение, указывающее, в порядке ли имя:
def check_name(person):
if person not in names:
print('\nNo test data found for ', person)
input("Press Enter to continue ...")
return False
else:
print(name_print + person)
return True
И в process_marks
вы можете использовать его как:
name = input('Enter name of student whose test results you wish to see: ')
if check_name(name):
print_scores(name)
Наконец, о проблеме parts
. Теперь у вас есть оценки, хранящиеся в names
вместе с соответствующим именем, которому они принадлежат. Таким образом, все, что нам осталось сделать, - это изменить print_scores
на один аргумент grades
и использовать его вместо parts
, а из process_marks
просто вызвать его:
print_scores(names[name])
Вид возможного полного кода:
names = {}
name_print = "\nSummary of Test Results for "
def process_marks(file_name):
with open(file_name) as f:
for line in f:
elements = line.split()
names[elements[0]] = elements[1:]
print(names)
print('\nNames of students who have written tests:')
print(*sorted(names), sep=' ')
name = input('Enter name of student whose test results you wish to see: ')
if check_name(name):
print_scores(names[name])
def check_name(person):
if person not in names:
print('\nNo test data found for ', person)
input("Press Enter to continue ...")
return False
else:
print(name_print + person)
return True
def print_scores(grades):
print('=' * (len(name_print) - 1))
test_scores = ' '.join(grades)
print('Test scores: ', end=' ')
print(test_scores)