Python 创建通过.txt文件处理学生成绩的函数

Python 创建通过.txt文件处理学生成绩的函数,python,function,Python,Function,有人能帮忙吗 我的驱动程序文件在这里: 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() 我正

有人能帮忙吗

我的驱动程序文件在这里:

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()
我正在尝试修改
进程标记(f)
以运行我的代码。并生成(从运行时没有函数的文件):

这就是我目前拥有的:

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
我需要帮助使
print_scores()
函数在
process_marks()
中工作

有人能看到我的错误在哪里吗?

您的错误(主要)在于将输入名称与文件的最后一行进行比较。这是因为您选中了
if parts[0]==name
where
parts=line.split()
。这意味着无论提供什么名称,
部分始终位于文件的最后一行


为了解决这个问题,我会从一个更好的存储数据的方法开始。现在,您只需将名称保存在列表中。但是成绩呢?我认为更好的解决办法是使用
dict
。因此,从以下几点开始:

names = {}  # instead of []
现在,您希望使用名称作为键(保持与列表类似的逻辑)和等级列表作为该键的值来填充该dict。因此,您的文件解析可以如下所示:

文件名中的行的
:
elements=line.split()
名称[元素[0]]=元素[1:]
#名字现在看起来像:{'Anthony':['85','85','85','85'],'Conor':[…],…}

现在另一件事是调用
check\u name
函数,然后在
process\u marks
中进行另一次签入。这似乎是多余的。我将更改
ceck_name
函数以返回一个布尔值,指示名称是否正确:

def check_姓名(人):
如果此人姓名不正确:
打印(“\n找不到”个人的测试数据)
输入(“按Enter键继续…”)
返回错误
其他:
打印(姓名+打印+人员)
返回真值
process\u marks
中,您可以将其用作:

name=input('输入您希望看到其测试结果的学生姓名:')
如果选中名称(名称):
打印分数(姓名)

最后,关于
零件
问题。现在,您已将成绩存储在
名称中
以及它们所属的匹配名称中。因此,我们所要做的就是更改
print_scores
,只取一个参数
grades
,并使用该参数而不是
部分
,然后从
过程_marks
调用它:

打印分数(姓名[姓名])

可能的完整代码视图:

names={}
name\u print=“\n的测试结果摘要”
def过程标记(文件名):
打开(文件名)为f时:
对于f中的行:
elements=line.split()
名称[元素[0]]=元素[1:]
打印(姓名)
打印(“\n参加笔试的学生姓名:”)
打印(*已排序(名称),sep='')
name=input('输入您希望看到其测试结果的学生姓名:')
如果选中名称(名称):
打印分数(姓名[姓名])
def检查组姓名(人):
如果此人姓名不正确:
打印(“\n找不到”个人的测试数据)
输入(“按Enter键继续…”)
返回错误
其他:
打印(姓名+打印+人员)
返回真值
def打印分数(等级):
打印('='*(列名打印)-1)
考试分数=''。加入(分数)
打印('测试分数:',结束='')
打印(考试成绩)

打印分数
功能中,什么是
零件
?它从来没有定义过。还有,为什么要检查名称[0]==name
?这意味着您的脚本将只适用于第一个名称。。。还有,为什么您的第一行只是
名称
?这在打印中没有有效部分。现在,分数在process_marks()中定义。我希望程序像这样运行:循环通过.txt并从每行(名称)中提取第一个索引。把名字打印在一行上。提示用户键入他们希望看到的名称。然后根据输入,如果名字在names中:打印分数,这些分数是名字所在行的以下索引,这很好。然而,我认为这与我所熟悉的有点相去甚远。我正在努力变得善于修改和处理这个特殊问题的列表,我不想偏离我当前的代码太远。我用另一种方式问这个问题:@Gizmo我真的不明白你说的太离谱是什么意思。唯一不同的是使用dict存储每个名字的分数。我的意思是,把名字存储在一个列表中是可以的,但是你如何得到这个名字的分数呢?每次都必须循环文件以查找该名称。如果你总是坚持自己喜欢的,你就永远不会前进。你应该乐于学习和接受新的东西,特别是像口述这样的基本内容。这只是一个提示,而不是批评。最后,不要就同一个问题提出太多问题。。。
names = {}  # instead of []