Python

Python 파일 입출력

dldbwls0818 2024. 10. 1. 17:43

파이썬에서 파일 입출력은 텍스트파일(txt), 바이너리 파일, CSV파일, JSON파일 등을 읽고 쓸 수 있습니다

입력 : 파일의 내용을 읽어 오는것

출력 : 파이썬 값을 os쪽으로 내보내는것

파일 열기 : 입출력

 

파일 쓰기

t는 생략이 가능하기 때문에 'w'는 'wt'와 같은 의미이다.

close()메서드를 반드시 써야 저장이 완료된다.

결과

writelines를 사용하면 이스트 안에있는 값을 작성해준다.

 

파일 읽기

read()를 통해 읽을 수 있으며 매개변수가 없을경우 여러줄을 한꺼번에 읽어오며,

있을경우 매개변수 만큼 읽어온다.(\n까지도 하나의 문자로 판단한다.)

 

with문 사용하기

- 파일을 보다 안전하고 깔끔하게 다루는 방법

- 컨텍스트 매니저를 사용하여 파일을 열고, 파일 작업이 끝나면 자동으로 파일을 닫아주는 역할

- 파일을 열고나서 오류가 발생하더라도 파일을 자동으로 닫아줌

- close()를 호출하지 않아도 되므로 코드가 간결해짐

1번줄은 f = open('word.txt', 'w')와 같은 의미이고, 같은 셀을 실행시키면 with의 특징으로 쓸 때 지우고 재생성 함.

파이썬의 문법도 사용이 가능하다!

 

 

-- 지금까지 배운 내용을 이용한 문제 만들기 --

 

class를 사용한 내 코드

class RangeError(Exception) :
  def __init__(self) :
    super().__init__('다시 입력하세요!')

class Dictionary :
  def __init__(self) :
    self.li = []

  def register(self, word, mean, lv) :
        self.li.append((word,mean,lv))
        print('등록 되었습니다.')

  def print_dict(self) :
    for i in self.li:
      print(f'{i[0]} : {i[1]}(레벨{i[2]})')

  def save_dict(self) :
    with open('words.txt', 'wt') as f :
      f.writelines(
          [f'{i[j]} 'if j<2 else i[j]+'\n' for i in self.li for j in range(0,3)]
          )

  def load_dict(self) :
    with open('words.txt', 'r') as f :
      li = []
      lil = f.readlines()
      while True :
        for i in lil :
          li.append(i.replace('\n','').split(' '))
        break
      self.li = li
      print('불러왔습니다')
      print(self.li)

class Users(Dictionary):
  def __call__(self) :
    while True :
      try :
        choice = int(input('1.등록하기 2.출력하기 3.저장하기 4.불러오기 5.종료하기'))
        if choice == 1 :
          word = input('단어를 입력하세요 : ').strip().lower()
          mean = input('뜻을 입력하세요 : ').strip()
          lv = input('레벨을 입력하세요 : ').strip()
          self.register(word, mean, lv)
        elif choice == 2 :
          self.print_dict()
        elif choice == 3 :
          self.save_dict()
        elif choice == 4 :
          self.load_dict()
        elif choice == 5 :
          print('프로그램을 종료합니다.')
          break
        else :
          raise RangeError()
      except RangeError as e:
        print(e)
      except Exception as e:
        print('숫자를 입력해주세요')

user = Users()

 

 

강사님 코드 (과제로 인한 수정과 삭제도 포함하였습니다.)

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

  def printAll(self) :
    for data in wordList :
      # 객체.eng, 객체.kor, 객체.lv
      print(f'{data.getEng()} : {data.getKor()} (레벨{data.getLv()})')

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

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

    # 수정하기
  def fixData(self) :
    count = 1
    fixEng = input('수정할 단어를 선택하세요 : ')
    for data in wordList :
      if data.getEng() == fixEng :
        fixKor= input(f'{fixEng}의 뜻을 입력하세요 : ')
        data.setKor(fixKor)
        fixLv = input(f'{fixEng}의 레벨을 입력하세요 : ')
        data.setLv(fixLv)
        print('수정되었습니다')
      elif count == len(wordList) :
        print('입력한 단어가 존재하지 않습니다')
      count += 1

  # 삭제하기
  def delData(self) :
    count = 0
    delEng = input('삭제할 단어를 입력하세요 : ')
    for data in wordList :
      if data.getEng() == delEng :
        del wordList[count]
        print('데이터가 삭제되었습니다.')
        count = 1
        break
      elif count == len(wordList) :
        print('삭제할 데이터가 존재하지 않습니다.')
      count += 1
class Word:
    def __init__(self, eng, kor, lv=1):
        self.eng = eng
        self.kor = kor
        self.lv = lv
    def setEng(self, eng):
        self.eng = eng
    def getEng(self):
        return self.eng
    def setKor(self, kor):
        self.kor = kor
    def getKor(self):
        return self.kor
    def setLv(self, lv):
        self.lv = lv
    def getLv(self):
        return self.lv
class Menu :
  def __init__(self) :
    self.wordService = WordService()

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

 

'Python' 카테고리의 다른 글

파일 입출력 Module  (2) 2024.10.02
Python 모듈(in Colab)  (0) 2024.10.01
Python 예외처리  (0) 2024.09.30
Python 스페셜 Method  (0) 2024.09.30
Python 상속  (0) 2024.09.27