File / Exception / Log Handling
실습했던 Link
File Handling
File
•
text 파일
◦
인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
◦
메모장으로 열면 내용 확인 가능
◦
메모장에 저장된 파일, HTML 파일, 파이썬 코드 파일 등
•
binary 파일
◦
컴퓨터만 이해할 수 있는 형태인 이진법 형식으로 저장된 파일
◦
일반적으로 메모장으로 열면 내용이 깨져 보임 (메모장 해설 불가)
◦
엑셀 파일, 워드 파일 등등
Python File I/O
•
파이썬은 파일처리를 위해 “open” 키워드를 사용함
f = open("<파일이름>", "접근 모드")
f.close()
# r 읽기모드
# w 쓰기모드
# a 추가모드 - 파일의 마지막에 새로운 내용을 추가시킬 때 사용
Python
복사
with open("i_have_a.txt", "r") as f:
Python
복사
with open("ashisland.txt", "r") as my_file:
content_list = my_file.readlines()
print(type(content_list))
print(content_list)
Python
복사
•
실행 시 마다 한줄 씩 읽어오기
◦
readline() 쓰면 된다
line = my_file.readline()
Python
복사
with open("ashisland.txt", "r") as my_file:
i = 0
while True:
line = my_file.readline()
if i == 5:
break
print("{0} ==== {1}".format(i, line))
i += 1
line
Python
복사
•
File read
# 더 깔끔
f = open("dfsd.txt", "r"). # 대상 파일이 같은 폴더에 있을 경우
contents = f.read()
print(contents)
f.close()
Python
복사
with open("ashisland.txt", "r") as my_file:
contents = my_file.read()
print(type(contents), contents)
Python
복사
•
File write
◦
mode는 “w”
◦
encoding=”utf8”
f = open("count_log.txt", 'w', encoding="utf8")
f.write(data)
f.close()
Python
복사
파이썬의 directory 다루기
•
os 모듈을 사용하여 Directory 다루기
import os
os.mkdir("log")
Python
복사
•
디렉토리가 있는지 확인하기
try:
os.mkdir("abc")
except FileExistsError as e:
print("Alreaddy created")
Python
복사
os.path.exists("abc")
os.path.isfile("file.ipynb")
Python
복사
shutil() 함수
→ shutil.copy
•
파일 복사 함수
import shutil
source = "ashisland.txt"
dest = os.path.join("abc", "island.txt")
dest
Python
복사
•
최근에는 pathlib 모듈을 사용하여 path를 객체로 다룸
import pathlib
pathlib.Path.cwd()
Python
복사
import pathlib
cwd = pathlib.Path.cwd()
cwd.parent
cwd.parent.parent
list(cwd.glob("*"))
Python
복사
Pickle
•
파이썬의 객체를 영속화(persistence) 하는 built-in 객체
•
데이터, object 등 실행 중 정보를 저장 → 불러와서 사용
•
저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
영속화 - 파이썬에서 사용하는 하나의 객체를 파일로 저장해서 쓰는 것
import pickle
f = open("list.pickle", "wb")
test = [1,2,3,4,5]
pickle.dump(test, f)
f.close()
Python
복사
del test
# 삭제하여도
Python
복사
f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
test_pickle
f.close()
# 복원 가능
Python
복사
Exception Handling
→ 예외가 발생할 경우, 후속 조치 등 대처 필요
•
try ~ except 문법
try:
예외 발생 가능 코드
except <Exception Type>:
예외 발생 시 대응하는 코드
Python
복사
a = [1, 2, 3, 4, 5]
for i in range(10):
try:
print(i, 10 // i)
except ZeroDivisionError: #builtIn error -> 이미 내장된 에러
print("Error")
print("Not divided by 0")
Python
복사
•
Built-in Exception : 기본적으로 제공하는 예외
Exception 이름 | 내용 |
IndexError | List의 Index 범위를 넘어갈 때 |
NameError | 존재하지 않은 변수를 호출 할 때ㅔ |
ZeroDivisionError | 0으로 숫자를 나눌 때 |
ValueError | 변환할 수 없는 문자/숫자를 변환할 때 |
FileNotFoundError | 존재하지 않는 파일을 호출 할 때 |
•
try ~ except ~ else
•
try ~ except ~ finally
•
raise 구문
◦
필요에 따라 강제로 Exception을 발생
raise <Exception Type> (예외정보)
Python
복사
•
assert 구문
◦
특정 조건에 만족하지 않을 경우 예외 발생
assert 예외조건
Python
복사
Logging Handling
로그 남기기 - Logging
•
프로그램이 실행되는 동안 일어나는 정보를 기록을 남기기
•
유저의 접근, 프로그램의 Exception, 특정 함수의 사용
•
Console 화면에 출력, 파일에 남기기, DB에 남기기 등
•
기록된 로그를 분석하여 의미있는 결과를 도출 할 수 있음
•
실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야하는 기록
print vs logging
•
기록을 print로 남기는 것도 가능함
•
그러나 Console 창에만 남기는 기록은 분석시 사용불가
•
때로는 레벨별(개발, 운영)로 기록을 남길 필요도 있음
•
모듈별로 별도의 logging을 남길 필요도 있음
•
이러한 기능을 체계적으로 지원하는 모듈이 필요함
파이썬의 로그 모듈
import logging
Python
복사
logging.debug("틀렸잖아!")
logging.info("롹인해")
logging.warning("조심해!")
logging.error("에러났어!!!")
logging.critical("망했다...")
Python
복사
logging level
•
프로그램 진행 상황에 따라 다른 level의 Log를 출력함
•
개발 시점, 운영 시점 마다 다른 Log가 남을 수 있도록 지원함
•
DEBUG > INFO > WARNING > ERROR > Critical
•
Log 관리시 가장 기본이 되는 설정 정보
•
debug
◦
개발시 처리 기록을 남겨야하는 로그 정보를 남김
•
info
◦
처리가 진행되는 동안의 정보를 알림
•
warning
◦
사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않는 정보가 들어왔을 때 알림
•
error
◦
잘못된 처리로 인해 에러가 났응나, 프로그램은 동작할 수 있음을 알림
•
critical
◦
잘못된 처리로 데이터 손실이나 더이상 프로그램이 동작할 수 없음을 알림
if __name__ == '__main__':
logger = logging.getLogger("main")
logging.basicConfig(level=logging.DEBUG)
logger.debug("틀렸어!!")
logger.info("확인해!")
logger.warning("조심해!")
logger.error("에러났어!")
logger.critical("망했다!")
Python
복사
configparser
•
프로그램의 실행 설정을 file에 저장함
•
Section, Key, Value 값의 형태로 설정된 설정 파일을 사용
•
설정파일을 Dict Type으로 호출 후 사용
argparser
•
Console 창에서 프로그램 실행시 Setting 정보를 저장함
•
거의 모든 Console 기반 Python 프로그램 기본으로 제공
•
특수 모듈도 많이 존재하지만(TF), 일반적으로 argparse 를 사용
•
Command-Line Option 이라고 부름
Logging formmater
•
Log의 결과값의 format을 지정해줄 수 있음
formatter = logging.Formatter('%(asctime)s %(levelname)s %(process)d %(message)s')
Python
복사