본문 바로가기

Python 기초

파이썬 예제(과제)-6. 파일 입출력을 이용한 단어장 만들기

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

문제1

아래 조건을 만족하는 영단어장을 만들어보자

  • 1. 등록하기, 2.출력하기, 3.저장하기, 4.불러오기, 5.종료하기
  • 1을  선택할 경우(메모리저장)
    • 단어를 입력하세요: apple
    • 뜻을 입력하세요: 사과
    • 레벨을 입력하세요: 1
    • 등록되었습니다. 출력
  • 2를 선택할 경우
    • apple: 사과,레벨,1
  • 3을 선택할 경우
    • 저장되었습니다(파일에 저장, words.txt)
  • 4를 선택할 경우
    • 불러왔습니다(파일에서 읽어옴, words.txt)
  • 5를 선택할 경우
    • 프로그램을 종료합니다.
  • 1~5까지의 숫자가 아닌 경우
    • 다시 입력하세요
  • 단, 프로그램을 클래스로 설계하도록 함. 이 프로그램은 클래스를 분화해서 가능함
wordList = []
filename = 'words.txt'

class Word: #객체지향 프로그래밍에서 객체를 직접 넣는건 X
    def __init__(self, eng, kor, lev=1):
        self.eng = eng
        self.kor = kor
        self.lev = lev

    def setEng(self, eng):  #.set() = 변경자메서드: 객체 변수의 값을 새로운 값으로 바꿈
        self.eng = eng      

    def getEng(self):       #.get() = 접근자메서드: 객체 변수의 값을 반환 or 계산
        return self.eng		#class로 만들면 나눠서 만들기, 짜임새있게 만들기 더 장점

    def setKor(self, kor):  #거의 모든 채팅,사이트는 서버에 메모리를 남김->용량이 너무 많음
        self.kor = kor      #사이트를 운영하는데 필수적이면 데이터베이스 사용
                             #그렇지 않은경우 텍스트파일 사용
    def getKor(self):       #쓸모없는 데이터 저장할 경우 텍스트에 저장
        return self.kor

    def setLev(self, lev):
        self.lev = lev

    def getLev(self):
        return self.lev

class WordService:
    def insertWord(self):
        eng = input('단어를 입력하세요: ')
        kor = input('뜻을 입력하세요: ')
        lev = input('레벨을 입력하세요: ')
        word = Word(eng, kor, lev)
        wordList.append(word)
        print('등록되었습니다.')

    def printAll(self):
        for data in wordList:
            # apple : 사과 (레벨 1)
            print(data.getEng() + ' : ' + data.getKor() + ' (레벨 ' + data.getLev() + ')')

    def saveAll(self):
        with open(filename, 'w') as f:
            for data in wordList:
                f.write(f'{data.getEng()},{data.getKor()},{data.getLev()}\n')
            print('파일에 저장했습니다')

    def loadData(self):
        with open(filename, 'r') as f:
            while True:
                line = f.readline()
                # apple,사과,1
                if line:
                    data = line.strip().split(',')
                    # ['apple', '사과', '1']
                    # word = Word(data[0], data[1], data[2])
                    wordList.append(Word(data[0], data[1], data[2]))
                else:
                    break
            print('데이터를 불러왔습니다')

class Menu:
    def __init__(self):
        self.service = WordService()

    def run(self):
        while True:
            try:
                menu = int(input('1.등록하기 2.출력하기 3.저장하기 4.불러오기 5.종료하기'))
                if menu == 1:
                    self.service.insertWord()
                elif menu == 2:
                    self.service.printAll()
                elif menu == 3:
                    self.service.saveAll()
                elif menu == 4:
                    self.service.loadData()
                elif menu == 5:
                    print('프로그램을 종료합니다')
                    break
            except Exception as e:
                print(e)
                print('다시 입력하세요!')

start = Menu()
start.run()

문제2

  • '/수정하기' 기능 추가
    • 수정할 단어를 선택하세요: apple
      • 선택한 단어가 없습니다
      • apple의 뜻을 입력하세요: 사과
      • apple의 레벨을 입력하세요: 1
      • 수정되었습니다.
  • '삭제하기' 기능 추가
    • 삭제할 단어를 선택하세요: apple
      • 선택한 단어가 없습니다.
      • 삭제되었습니다.
  • 불러오기 메뉴 선정
    • 메뉴 4번을 삭제
    • 프로그램 시작시 기존에 단어장 파일이 존재하는지 확인하고 있으면 그 파일에 있는 데이터를 메모리에 불러옴(없으면 스킵)
wordList = []
filename = 'words.txt'
# Word('apple', '사과',1)  a
# Word('apple', '사과',1) b
# Word('apple', '사과',1) c
# wordList = [a,b,c]
# for i in wordList:
# i -> a
# i- > b
# Word('apple', '사과',1).getEng
# i.getEng
# i.setEng('app')
# i는 self생성자이자, class


class Word: #객체지향 프로그래밍에서 객체를 직접 넣는건 X
    def __init__(self, eng, kor, lev=1):
        self.eng = eng
        self.kor = kor
        self.lev = lev

    def setEng(self, eng):  #.getset()메서드: 생성자함수, 매개변수에 직접
        self.eng = eng      # 단어 생성

    def getEng(self):        #class로 만들면 나눠서 만들기, 짜임새있게 만들기 더 장점
        return self.eng

    def setKor(self, kor):  #거의 모든 채팅,사이트는 서버에 메모리를 남김->용량이 너무 많음
        self.kor = kor      #사이트를 운영하는데 필수적이면 데이터베이스 사용
                             #그렇지 않은경우 텍스트파일 사용
    def getKor(self):       #쓸모없는 데이터 저장할 경우 텍스트에 저장
        return self.kor

    def setLev(self, lev):
        self.lev = lev

    def getLev(self):
        return self.lev

class WordService:
    def insertWord(self):
        eng = input('단어를 입력하세요: ')
        kor = input('뜻을 입력하세요: ')
        lev = input('레벨을 입력하세요: ')
        word = Word(eng, kor, lev)

        wordList.append(word)

        print('등록되었습니다.')

    def printAll(self):
        for data in wordList:
            # apple : 사과 (레벨 1)
            print(data.getEng() + ' : ' + data.getKor() + ' (레벨 ' + data.getLev() + ')')

    def saveAll(self):
        with open(filename, 'w') as f:
            for data in wordList:
                f.write(f'{data.getEng()},{data.getKor()},{data.getLev()}\n')
            print('파일에 저장했습니다')

    def loadData(self):
        with open(filename, 'r') as f:
            while True:
                line = f.readline()
                # apple,사과,1
                if line:
                    data = line.strip().split(',')
                    # ['apple', '사과', '1']
                    # word = Word(data[0], data[1], data[2])
                    wordList.append(Word(data[0], data[1], data[2]))
                else:
                    break
            print('데이터를 불러왔습니다')

    def modify(self):
        a=input('수정할 단어를 선택하세요')
        for i in wordList:
            if i.eng == a:
                i.setKor(input('의 뜻을 입력하세요: '))
                i.setLev(input('의 레벨을 입력하세요: '))
                print('수정되었습니다.')
            else:
                print('선택한 단어가 없습니다.')
    def delete(self):
        b=input('삭제할 단어를 선택하세요')
        for i in range(len(wordList)):
            if b==wordList[i].eng:
                del wordList[i]
                print('삭제되었습니다')
            else:
                print('선택한 단어가 없습니다.')

class Menu:
    def __init__(self):
        self.service = WordService()

    def run(self):
        while True:
            try:
                menu = int(input('1.등록하기 2.출력하기 3.저장하기 4.수정하기 5.종료하기 6.삭제하기'))
                if menu == 1:
                    self.service.insertWord()
                elif menu == 2:
                    self.service.printAll()
                elif menu == 3:
                    self.service.saveAll()
                elif menu == 4:
                    self.service.modify()
                elif menu == 5:
                    print('프로그램을 종료합니다')
                elif menu == 6:
                    self.service.delete()
                    break
            except Exception as e:
                print(e)
                print('다시 입력하세요!')

start = Menu()
start.run()