使用class-python保存在文件中

时间:2018-08-22 05:46:51

标签: python

我是python语言的新手。 我想将一行保存到文件并加载文件的特定行。 问题是我应该读取(加载)该文件的一行作为另一个(Grade)类的对象或将一行保存到文件中作为另一个类(Grade)的对象

我做到了,我想看看我是否做对了!

class Grade():

    def __init__(self,student_id=0,course_id=0,score=0):
        self._student_id = student_id
        self._course_id = course_id
        self._score = score


    @property
    def get(self):
        return str(self._student_id)+" "+str(self._course_id)+" "+str(float(self._score))
    @property

    def student_id(self):
        return str(self._student_id)
    @property
    def course_id(self):
        return str(self._course_id)
    @property
    def score(self):
        return str(self._score)

    @student_id.setter
    def student_id(self,student_id: int):
        self._sutdent_id = student_id
    @course_id.setter
    def course_id(self,course_id: int):
        self._course_id = course_id
    @score.setter
    def score(self,score: float):
        self._score = score


class CourseUtil():

    def __init__(self):
        self._address = ''

    def set_file(self,address):
        self._address = address

    def load(self,line_number):
        fp = open(self._address)
        for i, line in enumerate(fp):
            if i+1 == line_number:
                stri= line.split(" ")
                stdid = int(stri[0])
                corid = int(stri[1])
                score = float(stri[2])
                #here I want to save the #object that passed as argument to a file is it right?
               grade = Grade(stdid,corid,score)
                fp.close()
                return(grade)
        return print("None")


    def save(self,grade):
        i = 0
        k = 0
        fp = open(self._address)
        for  j,line in enumerate(fp):
            k += 1
            if grade.student_id in line and grade.course_id in line:
                i += 1
                break
        fp.close()
        if k > 0:
            if i == 0:
                with open(self._address,"a") as f:
                    f.write("\n"+grade.get)
        elif k == 0 and i == 0:
            with open(self._address,"a") as f:
                f.write(grade.get)

在保存功能中,我检查了数据是否唯一,并避免在文件末尾使用\ n

1 个答案:

答案 0 :(得分:0)

您使用的保存类条目行的模型效率低下。相反,您可以以更好的方式存储数据。我假设每个学生ID是唯一且可哈希的(字符串或整数)。因此,您只需拥有一本字典,其中包含有关每个学生的所有信息:

student_information = {
    {student_id}: {
        course_id: {course_id},
        score: {score}
    },
    ... # more students
}

现在,如果您想获取学生的信息,则只需执行student_information[student_id]即可获取所需的数据。例如,您可以这样做:

grade = Grade(
    student_id, 
    student_information[student_id]["course_id"], 
    student_information[student_id]["score"]
)

您可以轻松地将此字典设置为CourseUtil类的实例变量。

现在,@ juanpa.arrivillaga提到您应该使用pickle来存储该信息(如果您想稍后再使用它)。 Pickle允许您将数据(如字典)存储到文件中并加载。还有json可以帮助您做同样的事情。