📚 STUDY/AI

인공지능(AI) 기초 다지기: File / Exception / Log Handling

삶감 2022. 8. 3. 15:38

File / Exception / Log Handling

🔗 강의 바로가기

13_file_exception_handling_logging.pdf
1.2 MB

📖 강의 소개

이번 강의에서는 프로그램을 제대로 만들기 위해 알아야 하는 예외 처리와 파일 다루기에 대해서 배웁니다.

대부분의 경우 우리가 만드는 프로그램에는 우리가 예상치 못한 오류가 생기곤 합니다. 이를 해결하기 위해서 사전에 모든 경우를 다 지정해서 대비하는 경우도 있지만, 특정 상황에서 발생할 수 있는 예외를 포괄적으로 지정해서 대비하는 경우도 있습니다. 또, 실제 프로그램을 작성할 때는 파일에 존재하는 데이터를 사용하는 경우가 많습니다.

추가적으로 여러가지 프로그램을 진행하면서 기록을 남기는 로깅에 대해서도 배웁니다. 로그 데이터를 남기는 건 오늘날 데이터 기반의 애플리케이션 개발에서 매우 중요한 이슈가 되고 있습니다. 로그 데이터를 설계하는 것이 하나의 분야로 자리잡고 있을 만큼 매우 관심을 받고 있습니다.

이번 장을 통해서 파이썬으로 데이터를 다루는 가장 기본적인 영역을 시작해보겠습니다.



1. 예외 처리 Exception Handling

예상 가능한 예외

  • 발생 여부를 사전에 인지할 수 있는 예외
  • 사용자의 잘못된 입력, 파일 호출 시 파일 없음 등
  • 개발자가 반드시 명시적으로 정의 해야함

예상 불가능한 예외

  • 인터프리터 과정에서 발생하는 예외(개발자 실수)
  • 리스트의 범위를 넘어가는 값 호출, 정수 0으로 나눔 등
  • 수행 불가시 인터프리터가 자동 호출, 프로그램 종료
  • 예외가 발생할 경우 후속 조치 등의 대처가 필요하다
  • 프로그램도 일종의 제품이기 때문에 사용자가 잘못 사용하는 지점에 대해 사전적으로 막는 방법이 필요하다
  • if문, exception handling 사용



1) try ~ except 문법

try:
    # 예외 발생 가능 코드

except <Exception Type>:
    # 예외 발생시 대응하는 코드

except IndexError:
    # 인덱스 에러 발생시 대응하는 코드

except Exception as e:
    # 예외 발생시 대응하는 코드

finally: # 생략 가능함
    # 예외 발생 여부와 상관 없이 실행되는 코드

  • if else와 유사함
  • 그런데 파이썬에서는 try ~ except를 더 권장하는 경우가 있음
  • ZeroDivisionError처럼 built-in 예외 타입을 명시할 수 있음
  • 프로그램을 종료하지 않고 안정적으로 수행할 수 있게 함
  • 전체 Exception을 잡기 보다 built-in 예외로 잡아주는 것이 예외를 명시할 수 있어 낫다




Built-in Exception

picture 19
이 외에도 더 있으니 필요하면 검색을 해보기



2) raise 구문

  • 필요에 따라 강제로 예외를 발생
raise <Exception Type> (예외정보)

picture 20

  • 리소스를 위해서 코드를 멈춰야하는 경우 등



3) assert 구문

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

2. File handling

🔎 overview

  • File system, 파일 시스템: OS에서 파일을 저장하는 트리구조 저장 체계
  • File from wiki: 컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
    • 모든 프로그램은 파일로 구성되어 있고 파일을 사용



2-1. 파일의 종류

picture 22

  • 이진 파일의 경우 어플리케이션에 종속 되어있다고 표현함 (예. 엑셀파일은 엑셀에서만 열림)
  • 텍스트 파일도 사실상으로는 이진 파일임



2-2. Python File I/O

f = open("<파일이름>", "접근모드")
f.close()

picture 23



2-3. 파이썬의 File Read

  • read(): 파일 안에 있는 내용을 문자열로 반환
    picture 24
    r은 사실상 읽어올 파일의 주소를 지정해 준 것임
    f.read()를 해야 해당 주소에서 내용을 불러온다.
  • with구문 : 코드 실행이 다 일어나고 나면 영역 부분이 전부 close 된다.
    picture 26
    f.close()없이 사용 가능

  • readlines() : 파일의 내용을 한 줄씩 읽어 리스트로 반환
    picture 27
    picture 28
    read()는 파일 내용을 통채로 받아옴


  • readline() : 실행 시 마다 한 줄 씩 읽어오기
    파일의 용량이 너무 크거나 파일을 읽는데 시간이 너무 오래 걸리는 경우 등,
    한 줄 읽는 그때그때마다 메모리에 올리고 싶을 때
    picture 29



2-4. 파이썬의 File Write

  • mode = "w", encoding="utf8"

    • 인코딩: 문자를 컴퓨터에 저장하는데 어떤 방식으로 저장할 건지, 표준에 대한 이야기
    • 요즘 윈도우에서는 CP949라는 포멧을 사용한다고 함.
    • 읽어올 때 CP949에서는 해당 파일을 지원하지 않는다는 등의 문제가 생기면 인코딩을 utf8로 바꿔 저장하는 것이 좋다.
    • 파일 저장 시 파일 인코딩을 확인하기!
      picture 31
      실행 후 👇
      picture 32
  • mode = "a" : append
    기존의 파일의 마지막에 덧붙이는 것



2-5. 파이썬의 directory 다루기

  • os 모듈 사용

    • os.mkdir("디렉토리명") : 새로운 디렉토리 생성, 이미 생성된 디렉토리명인 경우 FileExistsError 발생
    • os.path.exist("디렉토리명") : 이미 디렉토리명인 경우 True 반환, if else 구문으로 처리 가능하다
    • os.path.isfile("파일명") : 파일인 경우 True 반환
    • os.path.join("상위경로", "하위경로")
      picture 33
      직접 \\를 이용해 문자열을 생성하는 방법은 권장하지 않음
      👉 OS에 따라서 경로 구분하는 문자가 다르기 때문(호환성 문제)
  • shutil 모듈 사용

    • shutil.copy("원본파일", "복사하려는 경로")
      picture 34
  • pathlib 모듈 사용
    • 최근 사용되는 방식
    • path 객체로 다룸, 훨씬 편하게 경로에 접근이 가능하다
      • OS에 따라서 경로가 조금씩 다른데 이런 부분의 호환 적용
    • picture 35
    • picture 36
    • picture 37



2-6. Log 파일 생성하기

  1. 디렉토리가 있는지
  2. 파일이 있는지 확인 후
    picture 38



2-7. Pickle

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

    • 객체는 원래 메모리에 있다.
    • 메모리에 있는 경우 인터프리터가 종료되고 나면 데이터가 사라짐
    • 인터프리터 종료 후에도 이전 데이터를 가지고 오고 싶을때 영속화를 해 따로 저장한다
  • 데이터, object 등 실행 중 정보를 저장 👉 불러와서 사용

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

  • pickle은 파이썬에 특화된 이진 파일 (rb, wb 사용)
    picture 39
    picture 40

  • 영속화 : 객체를 파일로 저장해서 사용하는 것

  • 클래스도 영속화가 가능하다

3. Logging Handling

3-1. 로그 남기기 - Logging

  • 프로그램이 실행되는 동안 일어나느 정보를 기록
  • 유저의 접근, Exception, 특정 함수의 사용
  • 콘솔에 출력, 파일에 남기기, DB에 남기기 ...



3-2. logging 모듈

  • 파이썬의 기본 Log 관리 모듈
    picture 41



3-3. logging level

  • 프로그램 진행 상황에 따라 다른 레벨의 Log 출력
  • 개발, 운영 시점마다 다른 Log가 남을 수 있도록 지원함
  • DEBUG (개발시점) > INFO (운영시점) > WARNING (운영시점+사용자) > ERROR (운영시점+사용자) > Critical (운영시점+사용자)
  • Log 관리시 가장 기본이 되는 설정 정보

picture 42




예시

picture 43
picture 44
로깅 레벨을 따로 지정하지 않아 warning 레벨 후 부터의 로그만 출력된다.
기본적으로 warning 레벨부터를 사용자에게 보여주기 때문

레벨 지정 방법
setLevel()을 원래 사용했으나, 파이썬 3.8 버전 이후부터는 basicConfig()를 사용

picture 45
picture 46

picture 47
picture 48


stream handler

picture 49
my.log라는 파일에 출력을 하겠다는 코드임

picture 50



3-4. Log 설정

  1. 데이터 파일 위치
  2. 파일 저장 장소
  3. Operation Type

설정 방법

  1. configparser : 파일에
  2. argparser : 실행 시점에



3-5. configparser

picture 51
Dict Type로 관리
:을 써도 되고 =를 써도 됨

picture 52



3-6 argparser

  • 콘솔 창에서 프로그램 실행 시 세팅 정보를 저장함
  • 거의 모든 콘솔 기반 파이썬 프로그램에서 기본으로 제공
  • 특수 모듈도 많이 존재하는데(Tensorflow), 일반적으로 argparse를 사용
  • Command-Line Option 이라고도 부름
    picture 53



728x90
728x90