Python读取fi时创建对象

2024-09-25 00:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个简单的Python脚本来确定是否报告了所有学生的成绩。脚本首先循环并将学生添加到有关年级状态的数组中。然后我再次循环查看文件,以确定每个学生的成绩。最后我得到了三个数组,其中包括“所有成绩已报告”、“部分成绩已报告”、“未报告成绩”的学生。但是,我想用面向对象的方法来解决这个问题。我试图创建一个有效的类。我被困在如何循环并为每个学生创建一个对象,然后使用addcourse将每个课程推到对象中。任何帮助我可以成为一个更好的程序员将是伟大的!在

数据:

**id,fname,lname,course,grade,mode**
10001,Freddy,Freshman,Art-101,A,online
10001,Freddy,Freshman,Art-101,A,online
10002,Suize,Sophmore,Mat-102,C,inperson
10002,Suize,Sophmore,Bio-101, ,inperson
10002,Suize,Sophmore,Soc-201,D,online
10003,Jilly,Junior,mth-102, ,inperson
10003,Jilly,Junior,Bus-101, ,inperson
10003,Jilly,Junior,Che-204, ,inperson

工作代码:

^{pr2}$

课堂尝试:

class Student(object):
    def __init__(self, lname, fname, term, courses = []):
        self.studid = studid
        self.lname = lname
        self.fname = fname
        self.term = term
        self.courses = []

    def addcourse(self, course, grade, mode):
        self.course = course
        self.grade = grade
        self.mode = mode
        self.courses.append((self.course, self.grade, self.mode))

Tags: selfmode报告fname学生onlinegradecourse
3条回答

除了@JCVanHanne的答案之外,你可以在你的班级里定义另一个函数来收集信息,不管一个学生是没有成绩、部分成绩还是全部成绩。在

一种可能的方法(假设缺失的等级由空字符串表示,同时也可能存在诸如a+或其他非空值的等级)可以是:

def gradeStatus(self):
    miss = [course[1] for course in self.courses].count("") # count empty grades
    if len(self.courses) == miss:
        print('No grades at all')
    elif miss in range(1, len(self.courses)):
        print('Some, but not all grades')
    elif miss == 0:
        print('All grades provided')
    else:
        print('Invalid Data')

您可能会使用状态码或其他方式(如返回值以进一步处理)来处理信息,而不仅仅是打印它们。以print命令为例:

^{pr2}$

正如@blade建议的那样,您可以创建一个按学生id索引的字典,然后为输入文件的每一行从字典中获取现有的学生(如果存在的话),或者创建一个新的字典。在代码中,这看起来像:

class Student(object):
    def __init__(self, student_id, lname, fname):
        self.studid = student_id
        self.lname = lname
        self.fname = fname
        self.courses = []

    def addcourse(self, course, grade, mode):
        self.courses.append((course, grade, mode))

students = {}

fh = open('students.txt').readlines()
header = fh.pop(0)

for line in fh:
    row = line.split(',')
    if len(row) < 6:
        continue

    student_id, fname, lname, course, grade, mode = [i.strip() for i in row]

    student = students.get(student_id, Student(student_id, lname, fname))
    student.addcourse(course, grade, mode)
    students[student_id] = student

有几件事需要注意。首先,我修改了Student类的构造函数,删除了term参数,因为不清楚在输入文件中指定了term的位置。此外,由于您不使用courses参数,所以我也放弃了它。(请注意,您可能不想使用[]作为默认参数。阅读mutable default arguments here)你也不需要在你的addcourse函数中为课程、年级和模式创建实例变量,你可以直接将它们附加到数组中。在

我还为从输入文件中提取的每个项添加了对strip的调用,以清理每行末尾的换行。在

这个怎么样:

  1. 添加一个dict,id是键,Student对象是值
  2. 循环文件,如果键在dict中,则从dict中获取Student对象,否则创建一个新的Student对象。然后将课程添加到Student对象。在

相关问题 更多 >