File / Exception / Log Handling
File / Exception / Log Handling
🔗 강의 바로가기
📖 강의 소개
이번 강의에서는 프로그램을 제대로 만들기 위해 알아야 하는 예외 처리와 파일 다루기에 대해서 배웁니다.
대부분의 경우 우리가 만드는 프로그램에는 우리가 예상치 못한 오류가 생기곤 합니다. 이를 해결하기 위해서 사전에 모든 경우를 다 지정해서 대비하는 경우도 있지만, 특정 상황에서 발생할 수 있는 예외를 포괄적으로 지정해서 대비하는 경우도 있습니다. 또, 실제 프로그램을 작성할 때는 파일에 존재하는 데이터를 사용하는 경우가 많습니다.
추가적으로 여러가지 프로그램을 진행하면서 기록을 남기는 로깅에 대해서도 배웁니다. 로그 데이터를 남기는 건 오늘날 데이터 기반의 애플리케이션 개발에서 매우 중요한 이슈가 되고 있습니다. 로그 데이터를 설계하는 것이 하나의 분야로 자리잡고 있을 만큼 매우 관심을 받고 있습니다.
이번 장을 통해서 파이썬으로 데이터를 다루는 가장 기본적인 영역을 시작해보겠습니다.
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
이 외에도 더 있으니 필요하면 검색을 해보기
2) raise 구문
- 필요에 따라 강제로 예외를 발생
raise <Exception Type> (예외정보)
- 리소스를 위해서 코드를 멈춰야하는 경우 등
3) assert 구문
- 특정 조건에 만족하지 않을 경우 예외 발생
2. File handling
🔎 overview
- File system, 파일 시스템: OS에서 파일을 저장하는 트리구조 저장 체계
- File from wiki: 컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
- 모든 프로그램은 파일로 구성되어 있고 파일을 사용
- 모든 프로그램은 파일로 구성되어 있고 파일을 사용
2-1. 파일의 종류
- 이진 파일의 경우 어플리케이션에 종속 되어있다고 표현함 (예. 엑셀파일은 엑셀에서만 열림)
- 텍스트 파일도 사실상으로는 이진 파일임
2-2. Python File I/O
f = open("<파일이름>", "접근모드")
f.close()
2-3. 파이썬의 File Read
read()
: 파일 안에 있는 내용을 문자열로 반환r
은 사실상 읽어올 파일의 주소를 지정해 준 것임f.read()
를 해야 해당 주소에서 내용을 불러온다.
with
구문 : 코드 실행이 다 일어나고 나면 영역 부분이 전부 close 된다.
f.close()
없이 사용 가능
readlines()
: 파일의 내용을 한 줄씩 읽어 리스트로 반환
read()
는 파일 내용을 통채로 받아옴
readline()
: 실행 시 마다 한 줄 씩 읽어오기
파일의 용량이 너무 크거나 파일을 읽는데 시간이 너무 오래 걸리는 경우 등,
한 줄 읽는 그때그때마다 메모리에 올리고 싶을 때
2-4. 파이썬의 File Write
mode =
"w"
,encoding="utf8"
- 인코딩: 문자를 컴퓨터에 저장하는데 어떤 방식으로 저장할 건지, 표준에 대한 이야기
- 요즘 윈도우에서는
CP949
라는 포멧을 사용한다고 함. - 읽어올 때 CP949에서는 해당 파일을 지원하지 않는다는 등의 문제가 생기면 인코딩을 utf8로 바꿔 저장하는 것이 좋다.
- 파일 저장 시 파일 인코딩을 확인하기!
실행 후 👇
mode =
"a"
: append
기존의 파일의 마지막에 덧붙이는 것
2-5. 파이썬의 directory 다루기
os
모듈 사용os.mkdir("디렉토리명")
: 새로운 디렉토리 생성, 이미 생성된 디렉토리명인 경우FileExistsError
발생os.path.exist("디렉토리명")
: 이미 디렉토리명인 경우True
반환, if else 구문으로 처리 가능하다os.path.isfile("파일명")
: 파일인 경우True
반환os.path.join("상위경로", "하위경로")
직접\\
를 이용해 문자열을 생성하는 방법은 권장하지 않음
👉 OS에 따라서 경로 구분하는 문자가 다르기 때문(호환성 문제)
shutil
모듈 사용shutil.copy("원본파일", "복사하려는 경로")
pathlib
모듈 사용- 최근 사용되는 방식
- path 객체로 다룸, 훨씬 편하게 경로에 접근이 가능하다
- OS에 따라서 경로가 조금씩 다른데 이런 부분의 호환 적용
2-6. Log 파일 생성하기
- 디렉토리가 있는지
- 파일이 있는지 확인 후
2-7. Pickle
파이썬의 객체를 영속화 하는 built-in 객체
- 객체는 원래 메모리에 있다.
- 메모리에 있는 경우 인터프리터가 종료되고 나면 데이터가 사라짐
- 인터프리터 종료 후에도 이전 데이터를 가지고 오고 싶을때 영속화를 해 따로 저장한다
데이터, object 등 실행 중 정보를 저장 👉 불러와서 사용
저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
pickle
은 파이썬에 특화된 이진 파일 (rb
,wb
사용)
영속화 : 객체를 파일로 저장해서 사용하는 것
클래스도 영속화가 가능하다
3. Logging Handling
3-1. 로그 남기기 - Logging
- 프로그램이 실행되는 동안 일어나느 정보를 기록
- 유저의 접근, Exception, 특정 함수의 사용
- 콘솔에 출력, 파일에 남기기, DB에 남기기 ...
3-2. logging
모듈
- 파이썬의 기본 Log 관리 모듈
3-3. logging level
- 프로그램 진행 상황에 따라 다른 레벨의 Log 출력
- 개발, 운영 시점마다 다른 Log가 남을 수 있도록 지원함
- DEBUG (개발시점) > INFO (운영시점) > WARNING (운영시점+사용자) > ERROR (운영시점+사용자) > Critical (운영시점+사용자)
- Log 관리시 가장 기본이 되는 설정 정보
예시
로깅 레벨을 따로 지정하지 않아 warning 레벨 후 부터의 로그만 출력된다.
기본적으로 warning 레벨부터를 사용자에게 보여주기 때문
레벨 지정 방법setLevel()
을 원래 사용했으나, 파이썬 3.8 버전 이후부터는 basicConfig()
를 사용
stream handler
my.log라는 파일에 출력을 하겠다는 코드임
3-4. Log 설정
- 데이터 파일 위치
- 파일 저장 장소
- Operation Type
설정 방법
- configparser : 파일에
- argparser : 실행 시점에
3-5. configparser
Dict Type로 관리:
을 써도 되고 =
를 써도 됨
3-6 argparser
- 콘솔 창에서 프로그램 실행 시 세팅 정보를 저장함
- 거의 모든 콘솔 기반 파이썬 프로그램에서 기본으로 제공
- 특수 모듈도 많이 존재하는데(Tensorflow), 일반적으로 argparse를 사용
- Command-Line Option 이라고도 부름