5-1. File / Exception / Log Handling

유승우·2022년 5월 2일
0

File, Except, Log Handling.html

Exception


  • 예상 가능한 예외
    • 발생 여부를 사전에 인지할 수 있는 예외
    • 사용자의 잘못된 입력, 파일 호출 시 파일 없음
    • 개발자가 반드시 명시적으로 정의 해야함
  • 예상 불가능한 예외
    • 인터프리터 과정에서 발생하는 예외, 개발자 실수
    • 리스트의 범위를 넘어가는 값 호출, 정수 0으로 나눔
    • 수행 불가시 인터프리터가 자동 호출
  • 예외가 발생할 경우 후속 조치 등 대처 필요
    • 없는 파일 호출 → 파일 없음을 알림
    • 게임 이상 종료 → 게임 정보 저장
    • 프로그램 = 제품, 모든 잘못된 상황에 대처가 필요

Exception Handling


  • 기본적인 try ~ except 구문

for i in range(10):
	try:
		print(10/i)
	except ZeroDivisionError:
		print("Not divided by 0")

  • Built-in Error


  • try ~ except ~ else
for i in range(10):
	try:
			result = 10/i
	except ZeroDivisionError:
		print("Not divided by 0")
	else:
		print(10/i)

  • try ~ except ~ finally
try:
	for i in range(1,10):
		result = 10//i
		print(result)
except ZeroDivisionError:
	print("Not divided by 0")
finally:
	print("종료되었습니다")

  • Error 가 발생한다고 생각되는 코드는 try ~ except 구문을 사용
  • 정상적인 로직에 의해 처리가 된다고 생각되면 if ~ else 구문을 사용

  • 필요에 따라 강제로 Exception을 발생
    • raise (예외정보)

      while True:
          value = input("변환할 정수값을 입력해주세요")
          for digit in value:
              if digit not in "0123456789":
                  raise ValueError("숫자값을 입력하지 않으셨습니다.")
          print("정수값으로 변환된 숫자 -", int(value))

  • 특정 조건에 만족하지 않을 경우 예외 발생
    • assert 예외조건

      def get_binary_number(decimal_number : int):
          assert isinstance(decimal_number, int)
          return bin(decimal_number)
      
      print(get_binary_number(10.0))

File Handling


  • OS에서 파일을 저장하는 트리구조 저장 체계

파일의 종류


Binary파일

  • 컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일
  • 일반적으로 메모장으로 열면 내용이 깨져 보임 (메모장 해설 불가)
  • 엑셀 파일, 워드 파일 등등

Text 파일

  • 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
  • 메모장으로 열면 내용 확인 가능
  • 메모장에 저장된 파일, HTML파일, 파이썬 코드 파일 등

  • File open
    f = open("<파일이름>", "접근 모드")
    f.close()
    
    f = open("ddd.txt","r")
    contents = f.read()
    print(contents)
    f.close()

  • with를 사용한 file open
with open("ddd.txt","r") as my_file:
    contents = my_file.read()
    print(type(contents), contents)
# 실행 시 마다 한 줄 씩 읽어오기
with open("ddd.txt","r") as my_file:
    i = 0
    while True:
        line = my_file.readline()
        if not line:
            break
        print(str(i) + " === " + line.replace("\n",""))
        i = i + 1
  • read()는 텍스트 파일 전체를 가져오고, readline()는 한줄씩 가져온다.

  • File Write
    • 문자나 글자를 컴퓨터에 어떤 방식으로 저장할지에 대한 표준 설정을 encoding이라 한다.

    • 윈도우에서는 'cp949'라는 포맷을 사용하기 때문에, encoding을 'utf-8'로 바꿔서 저장하면 편리하다.

      # file open
      f = open("example text2","w",encoding="utf8")
      for i in range(1,11):
          data = "{0}번째 줄입니다. \n".format(i)
          f.write(data)
      f.close()

  • Directory
    • 폴더 생성

      # 'log'라는 이름의 폴더 생성
      import os
      os.mkdir("log")
    • 파일 이동 및 복사

      • shutil.copy() : 파일 복사 함수

        import shutil
        
        source = "example text.txt"
        dest = os.path.join("log","source.txt")
        shutil.copy(source,dest)
      • 최근에는 pathlib 모듈을 사용하여 path를 객체로 다룸


  • Log 파일 생성하기
    • 1) 디렉토리가 있는지 확인

    • 2) 파일이 있는지 확인

      import os
      # Directory가 존재하는지 확인하고, 존재하지 않으면 생성
      if not os.path.isdir("log"):
          os.mkdir("log")
      # 파일이 있는지 확인하고, 없다면 새로 생성
      if not os.path.exists("log/count_log.txt"):
          f = open("log/count_log.txt","w",encoding="utf8")
          f.write("기록이 시작됩니다\n")
          f.close()
      
      # 여러 정보 기록
      with open("log/count_log.txt","a", encoding="utf8") as f:
          import random, datetime
          for i in range(1,11):
              stamp = str(datetime.datetime.now())
              value = random.random() * 100000
              log_line = stamp + '\t' + str(value) + "값이 생성되었습니다." + '\n'
              f.write(log_line)

  • Pickle
    • 파이썬의 객체를 영속화(persistence)하는 built-in 객체

    • 데이터, object 등 실행중 정보를 저장 → 불러와서 사용

    • 저장해야하는 정보, 계산 결과(모델)등 활용이 많음

    • 파이썬에 특화된 binary file

      # pickle
      import pickle
      
      f = open("list.pickle", "wb")
      test = [1,2,3,4,5]
      pickle.dump(test,f)
      f.close()
      
      f = open("list.pickle","rb")
      test_pickle = pickle.load(f)
      print(test_pickle)
      f.close()

Logging


  • 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기기

  • 유저의 접근, 프로그램의 Exception, 특정 함수의 사용

  • Console 화면에 출력, 파일에 남기기, DB에 남기기 등등

  • 기록된 로그를 분석하여 의미있는 결과를 도출 할 수 있음

  • 실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야하는 기록

  • print vs logging

    • 기록을 print로 남기는 것도 가능함
    • 그러나 Console 창에만 남기는 기록은 분석시 사용불가
    • 때로는 레벨별(개발,운영)로 기록을 남길 필요도 있음
    • 모듈별로 별도의 logging을 남길 필요도 있음
    • 이러한 기능을 체계적으로 지원하는 모듈이 필요함
  • logging level

    • 프로그램 진행 상황에 따라 다른 Level의 Log를 출력함

    • 개발 시점, 운영 시점마다 다른 Log가 남을 수 있도록 지원함

    • DEBUG > INFO > WARNING > ERROR > Critical

    • Log 관리시 가장 기본이 되는 설정 정보

      import logging
      
      logger = logging.getLogger("main") # Logger 선언
      logging.basicConfig(level=logging.DEBUG)
      logger.setLevel(logging.INFO)
      
      stream_hander = logging.FileHandler("my.log",mode="w",encoding="utf8") # Logger의 output 방법 선언
      logger.addHandler(stream_hander) # Logger의 output 등록
      
      logger.debug("틀렸잖아!")
      logger.info("확인해")
      logger.warning("조심해!")
      logger.error("에러났어!!")
      logger.critical("망했다....")
  • configparser

    • 프로그램의 실행 설정을 file에 저장함
    • Section, Key, Value 값의 형태로 설정된 설정 파일을 사용
    • 설정파일을 Dict type으로 호출 후 사용
  • argparser

    • Console 창에서 프로그램 실행시 Setting 정보를 저장함
    • 거의 모든 Console 기반 Python 프로그램 기본으로 제공
    • 특수 모듈도 많이 존재하지만(TF), 일반적으로 argparse를 사용
    • Command-Line Option 이라고 부름

0개의 댓글