프로그램을 짤 때는 예상치못한 여러 일들이 일어난다.
ex) 주소 입력하지 않고 주문
1. exception
1. 예상 가능한 것 (인터럽트와 유사)
-> 주소를 입력하지 않을 수 있으니 주소가 빈칸이 되는걸 막자!
2. 예상 불가능 한 것 (트랩과 유사)
-> 리스트 범위 초과, 0으로 나누기 등등
-> exception handing 필요!
try ~ expect 문법 (try ~ catch 라고도 한다)
for i in range(10):
try:
res = 10 // i;
except ZeroDivisionError:
print("Not divided by 0");
if문과 유사하지만, 에러를 잡고나서 프로그램을 종료하는 것이 아니라 예외처리 후 계속 실행할 수 있다는 장점이 있다. 그리고 if문은 주로 로직을 처리할 때 사용하므로 오류를 처리하는 try ~ except와 다른 점이 있다.
exception은 여러 종류의 built-in exception이 있다.
ex) 0으로 나누기, 인덱스 초과, value error 등등..
finally : 예외 발생 여부와 상관없이 항상 실행할 코드를 적는 부분이다.
for i in range(10):
try:
res = 10 // i
except ZeroDivisionError:
print("Not divided by 0")
finally:
print("---------")
raise구문
ex) raise ValueError("숫자를 입력하지 않았습니다.")
- 필요에 따라 강제로 exception을 발생시킨다.
- 누군가 이 프로그램을 쓸 때, 잘못 사용하는 경우를 방지하기 위해 사용한다.
assert구문
ex) assert + boolean타입의 문장
bool타입의 문장이 true면 통과하고, false면 error를 발생시킨다!
2. file handing
파일의 종류 : text vs binary
text : 사람도 이해할 수 있는 문자열 형태의 파일
-> 메모장으로 열면 확인 가능하다는 특징 = 어디서나 open 가능하다
binary : 컴퓨터만 이해할 수 있는 이진형태의 파일
-> 메모장으로 열면 내용이 깨져보인다는 특징 = 어플리케이션에 종속되어있다.
컴퓨터는 text 파일을 binary형태로 저장한다
어떤 기준으로 저장하는가? 아스키코드, unicode 등 표준을 따른다.
파이썬에서 파일 처리
open(파일명, 파일 모드) : 파일의 주소를 지정하여 해당 모드로 iopen
- 파일 읽기 모드 : r
파일 읽기 : 파일명.read() -> open한 파일을 read
open하면 꼭 close 해줘야하는데
with구문과 함께 사용하면 별도의 close문 없이도 close 가능
readlines() 함수 : 파일을 한 줄씩 읽어와서 리스트에 저장
readline() 함수 : 실행 시 마다 한줄 씩 읽어오기
두 함수의 차이? lines는 실행하면 내용을 메모리에 모두 올리고 한줄씩 잘라서 리스트에 저장
line은 실행하면 한 줄 읽어와서 그 한줄을 메모리에 올림
- 파일 쓰기 모드 : w
open할 때 encoding을 꼭 지정해주어야 한다. 리눅스와 맥은 주로 utf8을 사용한다. 윈도우는 cp949를 사용한다. encoding이 다르면 글자가 깨지거나 하는 위험이 있으므로 꼭 프로젝트 진행시에 encoding을 맞춰야한다.
그리고 원하는 내용을 write()함수안에 적어주면 파일이 write된다.
이때 파일이 없으면 파일을 생성하고,
기존에 존재하는 파일일 땐 그 파일 안에 내용이 있어도 입력한 내용으로 덮어버린다.
- 파일 이어쓰기 : a
기존 파일에 새로운 내용을 추가하는 모드이다.
os모듈 사용하여 directory 다루기
import os
os.mkdir("log")
os.path.exists("log")
os.path.isfile("file.py")
위 코드를 실행하면 log라는 폴더를 생성할 수 있다.
os 모듈 내부의 path 모듈을 사용하여 파일,폴더 등이 존재하는지 등등을 확인할 수 있다
shutil 모듈 이용하여 파일 옮기기
소스 파일을 특정 폴더로 옮기고자 할 때 사용한다.
import shutil
source = "b.py"
dest = os.path.join("log","a.py") # join은 log 폴더 안에 a.py파일을 넣으라는 함수이다
shutil.copy(source, dest) # b.py파일이 log폴더 안에 a.py파일로 바뀐다(=복사된다).
join을 사용하는 이유는 윈도우와 리눅스의 폴더 path 표현 방식 (자세히 말하자면 구분자)이 다르기 때문이다.
최근엔 pathlib을 사용한다. pathlib은 path를 객체로 다루기 때문에, 윈도우와 리눅스의 폴더 path 차이를 없앨 수 있다.
import pathlib
cwd =pathlib.Path.cwd()
print(cwd)
print(cwd.parent)
print(cwd.parent.parent)
print(list(cwd.parent.parents)
프로그램을 돌리다보면 프로그램의 실행 과정을 찍어놓은 log파일을 볼 수 있는데, log파일은 위와 같은 모듈들을 이용해서 만들어진 파일이다.
객체 저장(=객체 영속화) : pickle (파이썬에 특화된 바이너리 파일)
데이터, 객체 정보를 파이썬 인터프리터가 종료된 이후(= 메모리가 내려간 이후)에도 사용할 수 있도록 외부에 저장!
open시 파일 모드를 wb로 하고, pickle.dump(저장하고자 하는 정보, 파일)함수를 실행하면 파일에 저장하고자 하는 정보가 저장된다.
다시 읽어올 때는 open시 파일 모드를 rb로 하고, pickle.load(파일명)함수를 통해 저장된 정보를 불러올 수 있다.
logging handing : 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기기
- 기록된 로그를 분석하여 의미있는 결과를 도출할 수 있다
ex) 핵 잡기, 통계자료 얻기 등등
운영할 때 log
- info : 처리가 진행되는 동안의 정보를 알림
- warning : 원래 의도와 다른 정보가 들어왔을 때 알림
- error : 에러가 발생했음을 알림
- critical : 프로그램이 어떠한 이유로 인해 더이상 동작할 수 없음을 알림
개발할 때 log
- debug : 개발 시 처리 기록을 남겨야하는 정보를 기록
파이썬의 기본 log 관리 모듈
import logging
logging.debug("틀림") # 개발시점에서의 log
logging.info("확인") # 나머지는 운영 시의 log
logging.warning("조심")
logging.error("에러")
logging.critical("실패")
logging level이 존재하는데, 기본적으로는 warning부터 출력된다.(=사용자에게 보여진다.)
level을 바꾸고 싶다면
logging.basicConfig(level=logging.DEBUG) # 이러면 debug부터 출력됨
와 같은 방식으로 변경할 수 있다.
출력되는 곳을 바꿀 수 있는 steam_handler도 있다. 이 부분은 추후에 다시 다루도록 하겠당
logging시엔 설정해주어야하는 것이 있는데, 설정 도구에는 크게 2가지가 있다.
1. configparser : 프로그램 실행 설정을 file에 저장한다.
- 여러 Section안에 key, value의 형태로 저정한다.
2. argparser : console 창에서 프로그램 실행시 setting 정보를 저장한다.
- command-Line option이라고도 부른다.
ex) ls --help, python -V 등 argument를 이용한다.
config파일은 확장자로 .conf, .cfg등을 가진다.
logging 결과값은 formatter를 이용하여 format을 지정해준다.
format = logging.formatter('%(asctime)s %(levelname)s %(process)d %(message)s')
'파이썬' 카테고리의 다른 글
[파이썬] Vscode에서 코딩테스트 환경 설정 (0) | 2022.10.04 |
---|---|
파이썬 - data handling (0) | 2022.09.27 |
파이썬 - 모듈과 패키지 (0) | 2022.09.27 |
파이썬 - OOP (0) | 2022.09.27 |
[AI프로그래밍] 파이썬의 여러 라이브러리 (0) | 2022.09.25 |