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
whereparts=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 []