AI/부스트 코스

[부스트캠프 AI Tech 3기 Pre-Course] 꼭 알아야 하는 파이썬 기초 지식 File / Exception / Log Handling (파이썬 예외처리 / 파일 다루기)

hae-koos 2021. 12. 6. 00:53
728x90
반응형
모든 게시물은 macOS Monterey 12.0.1 버전을 기준으로 작성하였습니다.
부스트캠프 AI Tech 3기 예비 캠퍼를 위한 Pre-Course 강좌를 바탕으로 작성하였습니다.

 

https://www.boostcourse.org/

 

사소하지만 모르면 프로그래밍 하기 어려운 삼총사에 대한 이야기

 

Exception

 

예상이 가능한 예외 예상이 불가능한 예외
- 발생 여부를 사전에 예상할 수 있는 예외
- 개발자가 반드시 명시적으로 정의해야 함
- 인터프리터 과정에서 발생하는 예외
- 리스트 범위를 넘어가는 값 호출,
정수 0으로 나눔

- 수행 불가 시 인터프리터가 자동 호출

 

Exception Handling

 

 

if 문과 상당히 유사한 구조다. if 문으로 해도 상관이 없지만 except 사용을 권장.

0으로 숫자를 나눌 때 예외처리하는 것을 예시로 확인해보자.

 

ZeroDivisionError는 Built-in Error다.

 

ZeroDivisionError로 exception을 잡지 못하면 코드가 돌아가지 않고 종료된다.

리스트에서 Index를 초과하는 에러는 IndexError 등 Exception 처리 방법은

워낙 다양하기 때문에 필요할 때마다 검색하여 기입하는 것이 좋다.

그게 귀찮다면 방법이 있긴 하다.

 

 

except Exception 과 같이 예외처리를 해버리면 된다. Readibility 측면에서 별로.

not defined는 Name Error인데 저렇게 처리하면 돌아가지만 무슨 에러인지 모름.

 

 

위와 같이 else 구문을 함께 활용할 수도 있다. 복잡한 구조라서 추천하지 않는다.

 

 

예외 발생 여부와 상관없이 돌아가는 코드로 finally 구문이 있다.

 

 

ZeroDivisionError를 내고도 finally 구문은 돌아간 것을 확인할 수 있다.

또, 필요에 따라 강제로 Exception을 발생시키는 Raise 구문이 있다.

 

 

 

이와 함께, 특정 조건에 만족하지 않을 경우 Exception을 발생시키는

assert 구문의 예를 확인해보자.

 

 

 

정수 형태로 인풋을 넣어야 하는데 assert 부분을 True or False로 나오게 하고

False가 나오면 에러를 띄워 리소스 낭비를 막는다.


File Handling

 

 

 

이미지에서는 상대경로를 기입한 것이다.

 

open은 파일을 읽어온다기 보다는 읽어올 수 있도록 주소를 지정한 것이고,

f.read()를 해줘야 불러와서 contents에 저장하는 것이다.

 

with 구문을 함께 사용하면 with에 걸려있는 곳까지 계속 진행되다가 with 구문 끝나면

같이 종료되는데 f를 사용하는 것이 코드상 더 깔끔하다.

 

 

위와 같이 코드를 짜면 with indentation 밖에서 f를 출력하려고 했기 때문에 에러.

 

 

readlines()를 활용하면 한 줄 띄어쓰기를 기준으로 자른 다음에 파일 전체를

list 형태로 출력한다. content_list[0]으로 하면 첫 번째 줄만 나온다.

 

 

readlines()는 시작하자마자 모두 메모리에 올려서 한 줄 씩 가져오는 형태인데

파일 용량이 너무 커서 한번에 메모리에 올리기에 부담스러운 경우에는

위 코드를 사용한다. 한 줄 씩 읽어올 때마다 그 줄만 메모리에 올리는 형식이다.

if not line :  = > line이 없을 때까지 while True 문을 돌리는 형태다.

 

지금까지 배운 내용들을 토대로 단어 통계 프로그램을 만들어보자.

 

 

read()로 모든 내용을 우선 가져오고 split을 활용하여 단어, 줄마다 분리한다.

이제 파일 write로 넘어가자.

 

 

encoding = 의 경우, 기본적으로 문자를 컴퓨터에 저장하는데 어떤 방식으로

저장할 지 그 표준에 대한 이야기다. 한글과 동아시아는 utf8을 사용한다. (Mac)

요즘 윈도우는 cp949 형태를 이용한다고 한다.

 

 

파일을 w 모드로 열고, 10번의 iteration을 텍스트 파일에 해당 텍스트를 쓴다.

해당 폴더에서 파일을 열어보면 결과를 확인할 수 있다.

 

 

w 모드는 해당 파일을 만들어 저장하는 것이고, a 모드는 존재하는 파일에 덮는다.

w 모드는 반복해도 위 결과가 나올 것이고, a 모드로 반복하면 뒤에 더 생길 것.

 

이제 생각보다 자주 사용되는 os 모듈에 관한 이야기다.

 

 

+) os.path.exists("파일명")을 쓰면 True or False 로 파일 존재 여부를 알 수 있다.

 

 

모듈을 사용하여 path를 하나의 객체로 다뤄서 윈도우, 리눅스 등에서 사용되는

path를 통일성 있게 사용할 수 있다.

 

 

 

위와 같이 해당 폴더에 들어있는 모든 경로를 추출하는데 활용할 수도 있다.

 

 

os.path.isdir 을 이용하여 'log' 폴더가 있는지 먼저 확인하고 없다면 만든다.

파일이 없다면 파일을 w 모드로 생성한다. 후에 a 모드로 열어 작성한다.

 

 

객체는 원래 메모리에 있어야 한다.

파이썬 인터프리터가 끝나면 메모리는 없어지는데 이걸 계속 쓰고싶다 !

그때, pickle을 사용하여 영속화를 시킨다.

pickle은 파이썬에 특화된 binary 파일이다.

 

 

dump => test를 f에 저장해라.

 

 

 

rb 형태로 저장했던 pickle을 열면 저장했던 list가 나온다.

앞서 언급하였듯, pickle은 파이썬에 특화된 binary file이기 때문에 저장한

pickle 파일을 폴더에서 더블클릭으로 열려고 하면 이상한 문자가 나온다.

 

 

Multiply 라는 하나의 클래스도 pickle 형태로 저장한 것이다.

 

 

 

다양한 정보들을 필요할 때마다 pickle로 영속화하고 다시 가져와 사용할 수 있다.


Logging Handling

 

게임에서 핵 쓰는 애들 어떻게 잡을까 ?
-> 일단은 상황을 기록해야 핵 사용 여부를 알 수 있을것 !

 

이렇게 현재 상황에 대한 기록을 log, 이를 남기는 것을 logging이라 한다. 

 

 

실행시점에 남기는 기록은 User를, 개발시점에 남기는 기록은 에러를 잡기 위해.

기록을 print()로 남겨도 되겠지만 console 창에만 남으면 끄면 사라지기에

개발, 운영 등 레벨별로 로그를 남기거나, 모듈별로 로그를 남길 필요가 있다.

 

이러한 기능을 지원하는 Log 관리 모듈은 import logging 이다.

 

print문과 매우 비슷하다

 

 


Logging Level 설정하는 코드 구현 설명부터 글이 날아갔다 ^ㅡ^

 

그렇게 강의를 보고 있다가 평소에 자주 사용하지만 개념을 배우진 못했던

argparse가 등장하여 다시 기록한다. 

 

 

 

 

python arg_sum.py를 그냥 실행시키면 help에 저장된 내용이 뜨고,

parser 양식에 맞춰 console창에 명령어를 기입하면 올바르게 출력된다.

728x90
반응형