Преобразование программы, которая принимает файл .txt и изменение функций - PullRequest
0 голосов
/ 29 февраля 2020

Полностью завис на функциях ....

У меня есть файл .txt:

Bronson 90 85 75 76 
Conor 90 90 90 90
Austyn 50 55 32 75
Mark 96 95 85 85
Anthony 85 85 85 85 

И я пытаюсь взять этот код (ниже). И превратить его в функции для получения того же вывода:

with open(argv[1]) as f:
     names = []
     for line in f:
        names.append(line.split()[0])
        print('\nNames of students who have written tests:')
        print(*sorted(names), sep=' ')

# prompt user to input which student you want to view
      name = input('Enter name of student whose test results '
                     'you wish to see: ')
      if name not in names:
          print('\nNo test data found for ', name)
          input("Press Enter to continue ...")
      else:
          name_print = "\nSummary of Test Results for " + name

# print test scores of the student selected
      with open(argv[1]) as f:
          for line in f:
              parts = line.split()
              if parts[0] == name:
                  print(name_print)
                  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
===================================
Test scores:  85 85 85 85
Number of tests written ..................  4

Я хочу, чтобы он работал на одном модуле main (), используя process_marks(f):

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). #The program essentially runs in this function with help from helpers
    f.close()

main()

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

def process_marks(f):
        names = []
        for line in f:
            names.append(line.split()[0])
        print('\nNames of students who have written tests:')
        names = sorted(names)
        print(*names, sep=' ')
        name = input('Enter name of student whose test results '
                     'you wish to see: ')
        check_name(name, names)
        print_grades(name, line)

def check_name(name, names):
    if name not in names:
        print('\nNo test data found for ', name)
        input("Press Enter to continue ...")
    else:
        name_print = "\nSummary of Test Results for " + name
        print(name_print)
        print('=' * ((len(name_print)) - 1))

def print_grades(name, line):
    test_scores = ' '.join(line[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: Mark

Summary of Test Results for Mark
================================
Test scores:  n t h o n y   8 5   8 5   8 5   8 5

Я не хочу go далеко от текущего кода, который у меня есть (я хочу использовать списки et c, потому что id хотел бы в конечном итоге включать средние значения, max, min и c. Однако, я некоторое время размышлял над этим, имея очевидные проблемы с получением код для доступа к строке, соответствующей имени.

1 Ответ

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

Ваш метод-разбивка немного выключен.

Например, эта строка:

print_grades(name, line)

Будет использоваться последнее значение line из значения для l oop выше. Который всегда будет "Anthony"

. Вы можете попытаться передать значения из метода в метод, как показано ниже:

from sys import argv


def get_names(my_file):
    names = []
    for line in my_file:
        names.append(line.split()[0])
        print('\nNames of students who have written tests:')
        print(*sorted(names), sep=' ')
    return names


def get_and_check_name(names):
    name = input('Enter name of student whose test results '
                 'you wish to see: ')
    if name not in names:
        print('\nNo test data found for ', name)
        input("Press Enter to continue ...")
    else:
        name_print = "\nSummary of Test Results for " + name
        return name, name_print


def print_scores(f, name, name_print):
    for line in f:
        parts = line.split()
        if parts[0] == name:
            print(name_print)
            print('=' * ((len(name_print)) - 1))
            test_scores = ' '.join(parts[1:])
            print('Test scores: ', end=' ')
            print(test_scores)


def process_marks(f):
    While True:
        names = get_names(f)
        name, name_print = get_and_check_name(names)
        f.seek(0)
        print_scores(f, name, name_print)
        yes_no = input('\nDo again for another student?')
        if yes_no == 'n':
            break
        continue 

with open(argv[1]) as f:
    process_marks(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...