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

基于类的成绩单程序: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:40:21