Создание функции для обработки через .txt файл оценок учеников - PullRequest
0 голосов
/ 29 февраля 2020

Может кто-нибудь помочь ...

Мой файл драйвера находится здесь:

from functions import process_marks 

def main():
    try:
        f = open(argv[1])
    except FileNotFoundError:
        print("\nFile ", argv[1], "is not available")
        exit()
    process_marks(f)
    f.close()

main()

Я пытаюсь изменить process_marks(f), чтобы запустить мой код. и создайте это (из файла, который работает без функций):

Names of students who have written tests:
Anthony Austyn Bronson Conor Mark
Enter name of student whose test results you wish to see: Anthony

Summary of Test Results for Anthony
===================================
Test scores:  85 85 85 85
Number of tests written ..................  4

Это то, что у меня сейчас есть:

names = []
name_print = "\nSummary of Test Results for "

def process_marks(file_name):
    names
    for line in file_name:
        names.append(line.split()[0])
    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: ')
    check_name(name)
    parts = line.split()
    if parts[0] == name:
        print_scores(name)



def check_name(person):
    if person not in names:
        print('\nNo test data found for ', person)
        input("Press Enter to continue ...")
    else:
        print(name_print + person)        


def print_scores(person, parts):
        print('=' * ((len(name_print)) - 1))
        test_scores = ' '.join(parts[1:])
        print('Test scores: ', end=' ')
        print(test_scores)

Какие выходные данные:

Names of students who have written tests:
Anthony Austyn Bronson Conor Mark
Enter name of student whose test results you wish to see: Anthony

Summary of Test Results for Anthony

I нужна помощь, чтобы функция print_scores() работала в process_marks().

Может кто-нибудь увидеть, где мои ошибки l ie?

1 Ответ

0 голосов
/ 29 февраля 2020

Ваша ошибка (в основном) заключается в том, что вы сравниваете имя ввода с последней строкой файла. Это потому, что вы проверяете 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...