Csv.py

Facade class Csv:

 1  
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os
from csv import reader

class Csv:
    def __init__(self, rel_path):       # constructor 
        script_dir = os.path.dirname(__file__)      # 'os' for compatibility reason 
        abs_file_path = os.path.join(script_dir, rel_path)
        with open(abs_file_path, newline='') as csvFile:
            self.__listStudents = list(reader(csvFile, delimiter=';'))[1:]  # omit 1st line

    def importClassNames(self):
        classNames = []                 # empty list with names of school classes
        for listStudent in self.__listStudents:
            if listStudent[3] not in classNames:    # if not already added to list
                classNames.append(listStudent[3])
        return classNames

    def importStudentsOfClass(self, className):
        studentsOfClass = []
        for listStudent in self.__listStudents:
            if listStudent[3] == className:         # if sudent is in school class
                studentsOfClass.append(listStudent)
        return studentsOfClass

School.py

Method importStudentsFromCSV() was added to class School:

 1  
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from Csv import Csv
from User import Student

class School:                           
    def __init__(self,schoolClasses):
        self.__schoolClasses = schoolClasses
        
    def getSchoolClasses(self):
        return self.__schoolClasses

    def addSchoolClass(self, schoolClass):        
        self.__schoolClasses.append(schoolClass)

    def importStudentsFromCSV(self, filename):    # import students of a certain csv file 
        csv = Csv(filename)
        classNames = csv.importClassNames()       # import names of school classes

        for className in classNames:
            schoolClass = SchoolClass(className,[])
            listStudents = csv.importStudentsOfClass(className) # import student data of a certain name of school class 
            for listStudent in listStudents:
                student = Student(listStudent[0],listStudent[1],listStudent[2],schoolClass)
            self.addSchoolClass(schoolClass)
        
    
class SchoolClass:
    def __init__(self,name, students):
        self.__name = name
        self.__students = students                
        
    def getName(self):
        return self.__name

    def getStudents(self):
       return self.__students

    def addStudent(self, student):                
        self.__students.append(student)

testImport.py

 1  
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from School import *                         # import classes
from User import *
from Csv import Csv 

school = School([])

school.importStudentsFromCSV("students.csv") # import students

schoolClasses = school.getSchoolClasses()    # output
for sc in schoolClasses:
    print(f"School class: {sc.getName()}") 
    Students = sc.getStudents()
    for student in Students:   
        print(f"\t{student.getSurname()}, {student.getFirstname()} in school class {student.getSchoolClass().getName()}")


Output

School class: c1
    Colligan, Manda in school class c1
    Thieme, Madelaine in school class c1
School class: c2
    Hickle, Sara in school class c2
    Murchison, Jeffrey in school class c2
    Tarleton, Vito in school class c2


The UML sequence diagram can also be used for a better understanding:

UML sequence diagram of csv import

UML sequence diagram of csv import


Last modified: Monday, 24 April 2023, 10:48 AM