基于类的成绩单程序:TXT读取报错及仅打印最后学生问题排查
成绩单程序错误解决指南
一、初始错误:ValueError: too many values to unpack (expected 4)
问题原因
原始代码中,你尝试将学生信息行拆分为4个变量:
fn, ln, id, itp = inFile.readline().split()
但对应文本行(如Lisa Miller 890238 Y 4)用split()拆分后会生成5个元素(["Lisa", "Miller", "890238", "Y", "4"]),变量数量和元素数量不匹配,因此触发ValueError。
同时你错误地单独读取课程数量:
ns = int(inFile.readline())
实际上学生行的最后一个值就是课程数,单独读行会导致后续行读取错位。
修正方案
直接拆分学生行为5个变量,提取课程数:
fn, ln, id, itp, ns = inFile.readline().split() ns = int(ns)
删除单独读取ns的代码行,避免行指针偏移。
二、调整后仅打印最后一位学生的问题
核心错误:循环变量误用
更新后的代码中,打印学生信息的循环误用了外层循环的变量i:
for k in range(numStd): Std[i].print() print()
外层循环结束后,i的值停留在最后一个学生的索引(比如3个学生时i=2),因此每次循环都只打印最后一个学生的信息。
修正
将Std[i].print()改为Std[k].print(),使用当前循环的变量k:
for k in range(numStd): Std[k].print() print()
额外问题:学生信息提取错误
你的更新代码中,学生信息拆分逻辑完全错误:
原始学生行Lisa Miller 890238 Y 4拆分后是5个元素,但你错误提取:
First_Name = Line2[0] ID = Line2[1] isTutionPaid = Line2[2] noOf_Subjects = int(Line2[3])
这会导致ID被设为Miller、缴费状态被设为890238,完全不符合数据结构。正确提取方式:
First_Name = Line2[0] Last_Name = Line2[1] ID = Line2[2] isTutionPaid = Line2[3] noOf_Subjects = int(Line2[4]) # 拼接完整姓名 Std[i].setName(f"{First_Name} {Last_Name}")
修正后的完整主函数代码
if __name__ == "__main__": with open("stData.txt", 'r') as inFile: line = inFile.readline().split() numStd = int(line[0]) Tuition_Rate = int(line[1]) Std = [Student() for _ in range(numStd)] for i in range(numStd): Line2 = inFile.readline().split() First_Name = Line2[0] Last_Name = Line2[1] ID = Line2[2] isTutionPaid = Line2[3] noOf_Subjects = int(Line2[4]) Std[i].setN(noOf_Subjects) Std[i].setName(f"{First_Name} {Last_Name}") Std[i].setId(ID) Std[i].setIsTutionPaid(isTutionPaid) Std[i].tutionRate(Tuition_Rate) for j in range(noOf_Subjects): Line3 = inFile.readline().split() Course_Name = Line3[0] Course_Number = Line3[1] Credit_Hours = int(Line3[2]) Grade = Line3[3] Std[i].addStudent(Course_Name, Course_Number, Credit_Hours, Grade) print("Number of students:", numStd, "and Tuition Rate $", Tuition_Rate, "per credit hour") for k in range(numStd): Std[k].print() print()
内容的提问来源于stack exchange,提问作者Syed Qasim Qamar Abbas Jafri
相关产品推荐
相关产品推荐

