본문 바로가기
자바과정/파이썬

파이썬 성적처리(클래스, 함수화, 파일처리)

by Parkej 2021. 4. 25.

 

파일처리도 추가한 성적처리
 - 보완할 부분 : 학생이라는 클래스를 따로 생성해서 해보기
import pickle #파일처리를 위한 모듈 임포트

# 학생관리 클래스 생성
class Score_management:
	
    def __init__(self):
        self.studentlist = [] # 학생정보들을 담을 리스트 초기화

    def menu(self):
    # 메뉴선택에 따라 맞는 함수들 호출
        while 1:
            num = int(input('1. 성적입력 2. 검색 3. 삭제 4. 파일저장 5. 수정 6. 파일불러오기 7. 종료 : '))
            print('*' * 40)
            if num == 1:
                print('--학생 정보 입력')
                self.insert()
            elif num == 2:
                print('--학생 검색')
                self.search(int(input('1. 전체 2. 개인 : ')))
            elif num == 3:
                print('--삭제')
                self.delete()
            elif num == 4:
                print('--파일저장')
                self.studentsave()
            elif num == 5:
                print('--수정')
                self.modify()
            elif num == 6:
                print('파일불러오기')
                self.studentload()
            elif num == 7:
                break
            else:
                print('다시 입력')

    # 학생 수, 개인 정보 입력
    def insert(self):
        for i in range(int(input('학생 수 입력 : '))):
            student = input('이름 , 과목별 점수 입력 : ').split() # student[0] = 이름, student [ 1~] 입력된 점수
            total = sum(list(map(int, student[1:]))) # 점수부분부터 자르기 위한 코드 총점을 구하기 위함
            avg = total // len(student[1:])
            student.extend([total, avg]) # 총점과 평균을 구한뒤 student객체 안에 리스트를 extend 해줌. (리스트가 벗겨지고 요소들만 들어감)
            self.studentlist.append(student) # 입력완료된 객체를 리스트에 추가
            print('-' * 40)
        print('*' * 40)

    # 학생 조회 (전체, 개인)
    def search(self, num):
        # 전체 조회
        if num == 1:
            for i in self.studentlist:
                print(i, sep='\n')

        # 개인 조회
        elif num == 2:
            name = input('조회할 이름 입력 : ')
            for i in range(len(self.studentlist)):
                if self.studentlist[i][0] == name:
                    print(self.studentlist[i])

    # 학생 삭제
    def delete(self):
        while 1:
            print('{:-^35}'.format('학생 목록'))
            for i in range(len(self.studentlist)):
                print('{} {}'.format(i, self.studentlist[i]), sep='\n')
            print('-' * 40)
            # 이름으로 삭제
            # name = input('삭제할 학생이름 입력 : ')
            # for i in self.studentlist:
            #   if name in i[0]:
            #     self.studentlist.remove(i)

            # 번호로 삭제 (인덱스 번호)
            num = input('삭제할 학생 번호 입력 [b : 뒤로가기] : ')
            if num == 'b':
                return -1
            num = int(num)
            try:
                if self.studentlist[num] in self.studentlist:
                    self.studentlist.remove(self.studentlist[num])
            except:
                print('없는 번호입니다.')
                return

    # 학생 수정
    def modify(self):
        print('{:-^35}'.format('학생 목록'))
        for i in range(len(self.studentlist)):
            print('{} {}'.format(i, self.studentlist[i]), sep='\n')
        print('-' * 40)

        while 1:
            num = input('수정할 학생 번호입력 [b : 뒤로가기] : ')
            if num == 'b':
                return -1
            num = int(num)
            try:
                if self.studentlist[num] in self.studentlist:
                    print('{}'.format(self.studentlist[num]))
                    ch = self.studentlist[num].index(input('수정 값 선택 (배열 마지막 요소 두개는 수정 불가) : '))
                    self.studentlist[num][ch] = input('수정할 내용 입력 : ')
                    total = sum(list(map(int, self.studentlist[num][1:-2])))
                    avg = total // len(self.studentlist[num][1:-2])
                    self.studentlist[num][-2] = total
                    self.studentlist[num][-1] = avg
                    print('수정완료')
            except:
                print('없는 번호입니다.')
                return

    # 파일 저장
    def studentsave(self):
        print('저장할 파일 이름 입력.')
        with open(input() + '.p', 'wb') as file:
            pickle.dump(self.studentlist, file) # 리스트에 저장된 객체를 바이너리 파일로 저장

    # 파일 불러오기
    def studentload(self):
        print('디렉토리에 저장된 파일 이름 입력')
        try:
            with open(input() + '.p', 'rb') as file:
                self.studentlist = pickle.load(file) # 바이너리 파일을 다시 학생리스트에 초기화
        except:
            print('없는 파일입니다.')


a = Score_management()
a.menu()
반응형

댓글