You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python成绩文件处理程序功能异常及IndexError报错求助

成绩汇总Python代码问题排查

我编写了一段用于生成成绩汇总报告的Python代码,预期运行时输入课程文件(如COP1000C.txt)可生成完整的成绩汇总,输入错误文件名时会触发错误提示,但实际运行仅显示部分结果,且无错误提示,还出现报错:grade = int(content[i+1].replace("\n","")) IndexError: list index out of range,恳请协助排查问题方向。

代码内容

#Loops as long as user wants to continue
while True:
 #Required variables
 totalGrade = 0
 count = 0
 passed = 0
 failed = 0
 #Prints the greeting message
 print("Course Grades Summary Report ...\n")
 #Takes file name from the user
 fileName = input("Enter name of course file:  ")
 #Prints the header of the report
 print()
 print("-"*60)
 print("{0:>41}".format("Broward College Grades Summary"))
 print("-"*60)
 #Opens the given file in read mode
 with open(fileName, "r") as f:
    #Reads the entire file lines into a list
    content = f.readlines()
    #Reads course name, professor name and term values
    courseName = content[0].replace("\n","").strip()
    professor = content[1].replace("\n","").strip()
    term = content[2].replace("\n","").strip()
    #Displays course name, professor and term values
    print()
    print(courseName)
    print("Professor: {0:<32} Term:{1}".format(professor,term))

    #Displays student name and grade header
    print("{0:<32}{1}".format("\nStudent Name","Grade"))
    print("-"*40)
    #Loops through every line further
    for i in range(3, len(content), 2):
        #Reads student name and grade
        name = content[i].replace("\n","").strip()
        grade = int(content[i+1].replace("\n","").strip())
        #Calculates total of grades,number of students,
        #number of students passed and number of students failed
        totalGrade += grade
        count += 1
        if grade < 60:
            failed += 1
        else:
            passed += 1
            #Displays name and grade
            print("{0:<32}{1}".format(name, grade))

        #Calculates average grade and passing percentage
        averageGrade = totalGrade/count
        passingPercentage = (passed / (passed + failed))*100
    #Displays output
    print("\nStudents' Performance")
    print("-"*40)
    print("Passed: {0:<25}Failed: {1}".format(passed, failed))
    print("Passing Percent: {0:.0f}%".format(passingPercentage))
    print("Average Grade: {0:.0f}".format(averageGrade))
    #Reads whether user wants to continue or not
    choice = input("Would you like to process another file (y/n)? ")
    if choice.lower() == 'n':
        break

问题排查方向

1. 索引越界的核心原因:文件格式不匹配

代码默认从第3行开始,每两行对应一个学生的「姓名+成绩」,但如果输入文件不符合这个规则(比如末尾缺少成绩行、存在空行、学生信息不成对),循环到最后时i+1会超出content列表的长度,直接触发IndexError。比如文件最后一行是学生姓名,没有对应的成绩行,就会出现这个报错。

2. 无错误提示:缺失异常处理逻辑

代码没有对「文件不存在」「文件内容不足3行」等异常情况做捕获处理:

  • 输入错误文件名时,会直接抛出系统原生的FileNotFoundError,而不是自定义的错误提示;
  • 如果文件行数少于3行,读取content[0]/[1]/[2]也会直接报错,没有友好提示。

3. 仅显示部分结果:及格学生才被打印

代码里的学生信息打印语句放在了else分支(只有成绩≥60的学生才会输出),不及格的学生信息不会显示,所以看起来像是只输出了部分结果。

修复建议

(1)校验文件格式,避免索引越界

在循环中先判断i+1是否在列表范围内,防止越界:

for i in range(3, len(content), 2):
    if i+1 >= len(content):
        print(f"警告:第{i+1}行缺少对应成绩,跳过该学生")
        continue
    name = content[i].replace("\n","").strip()
    grade = int(content[i+1].replace("\n","").strip())
    # 后续统计逻辑...

(2)添加异常捕获,处理错误场景

用try-except包裹文件操作,处理文件不存在、内容不完整的情况:

try:
    with open(fileName, "r") as f:
        content = f.readlines()
        if len(content) < 3:
            print("错误:文件内容不完整,缺少课程/教授/学期信息")
            continue
        # 读取课程信息等后续逻辑...
except FileNotFoundError:
    print("错误:输入的文件名不存在,请重新输入")
    continue

(3)调整打印位置,显示所有学生信息

把打印学生信息的代码移到if-else分支外面,让及格和不及格的学生都能显示:

if grade < 60:
    failed += 1
else:
    passed += 1
# 移到分支外,所有学生都打印
print("{0:<32}{1}".format(name, grade))

内容的提问来源于stack exchange,提问作者jeremyt123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:15:11