Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
169 views
in Technique[技术] by (71.8m points)

python - Creating a function to process through a .txt file of student grades

Can someone help...

My driver file is here:

from functions import process_marks 

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

main()

I'm trying to modify process_marks(f) to run my code. and produce this (from file that runs without functions):

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

This is what I currently have:

names = []
name_print = "
Summary of Test Results for "

def process_marks(file_name):
    names
    for line in file_name:
        names.append(line.split()[0])
    print('
Names 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('
No 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)

Which outputs:

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 need help making print_scores() function work in process_marks().

Can someone see where my errors lie?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Your error (mainly) lies in the fact that you are comparing the input name to the last row of the file. This is because you check if parts[0] == name where parts = line.split(). This means the parts are of the last row of the file always - no matter what name provided.


To fix this, I would start by a better way of storing your data. Right now you are just saving the names in a list. But what about the grades? I think a better solution would be to use a dict. So start by changing to:

names = {}  # instead of []

Now you want to fill that dict with the names as keys (keeps the logic similar as with the list) and the list of grades as the value for that key. So your file parsing can look like:

for line in file_name:
    elements = line.split()
    names[elements[0]] = elements[1:]
# names now look like: {'Anthony': ['85', '85', '85', '85'], 'Conor': [...], ... }

Now another thing is that you call the check_name function but then make another check in process_marks. This seems redundant. I would change the ceck_name function to return a boolean indicating if the name is ok or not:

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

And in process_marks you can use it as:

name = input('Enter name of student whose test results you wish to see: ')
if check_name(name):
    print_scores(name)

Lastly, regarding the parts issue. Now you have the grades stored in names along with the matching name they belong to. So all we have left to do is change print_scores to take only one argument grades and use that instead of parts, and from process_marks just call it:

print_scores(names[name])

A view of a possible complete code:

names = {}
name_print = "
Summary 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('
Names 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('
No 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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...