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
相关产品推荐
相关产品推荐

