Ai tech Day5

Lee·2021년 1월 23일
0

Exception/File/Log Handling

Exception

프로그램을 사용할 때 일어나는 오류

예상 가능한 예외

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

예상이 불가능한 예외

  • 인터프리터 과정에서 발생하는 예외, 개발자 실수
  • 리스트의 범위를 넘어가는 값 호출, 정수 0으로 나누는 경우
  • 수행 불가시 인터프리터가 자동 호출

Exception Handling 예외 처리

  • try ~ except 문법
try:
    예외 발생 가능 코드
except <Exception Type>: # Exception Type은 이미 정해져 있다.
    예외 발생시 대응하는 코드
  • Built-in Exception: 기본적으로 제공하는 예외

    Exception 이름내용
    IndexErrorList의 Index 범위를 넘어갈 때
    NameError존재하지 않은 변수를 호출 할 때
    ZeroDivisionError0으로 숫자를 나눌 때
    ValueError변환할 수 없는 문자/숫자를 변환할 때
    FileNotFoundError존재하지 않는 파일을 호출할 때

  • 파이썬의 예외 처리 예시
for i in range(10):
    try:
        print(10 / i)
    except ZeroDivisionError as e:
        print(e)
        print("Not divided by 0")
  • Exception as e
    오류를 지정해주지 않아도 exception을 잡아준다.
    다른 사용자가 어디서 오류가 발생했는지 알기 어렵기 때문에 좋은 코드는 아니다.
for i in range(10):
    try:
        print(10 / i)
    except Exception as e:
        print(e)
        print("Not divided by 0")
  • else 구문
try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 동작하는 코드
else:
    예외가 발생하지 않을 때 동작하는 코드
for i in range(10):
    try:
        result = 10 / i
    except ZeroDivisionError:
        print("Not divided by 0")
    else:
        print(10 / i)
  • finally 구문
try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 동작하는 코드
finally:
    예외 발생 여부와 상관없이 실행됨
try:
    for i in range(1, 10):
        result = 10 // i
        print(result)
except ZeroDivisionError:
    print("Not divided by 0")
finally:
    print("종료되었습니다.")
  • raise 구문
    필요에 따라 강제로 Exception을 발생시킨다.
raise <Exception Type>(예외정보)
while True:
    value = input("변환할 정수 값을 입력해주세요")
    for digit in value:
        if digit not in "0123456789":
            raise ValueError("숫자값을 입력하지 않으셨습니다")
    print("정수값으로 변환된 숫자 -", int(value))
  • assert 구문
    특정조건에 만족하지 않을 경우 예외 발생
assert 예외조건
def get_binary_nmubmer(decimal_number):
    assert isinstance(decimal_number, int)
    return bin(decimal_number)
    
print(get_binary_nmubmer(10))


File

File system: OS에서 파일을 저장하는 트리구조 저장 체계

File vs Directory

Directory

  • 폴더 또는 디렉토리로 불린다.
  • 파일과 다른 디렉토리를 포함할 수 있다.

File

  • 컴퓨터에서 정보를 저장하는 논리적인 단위 (wikipedia)

  • 파일은 파일명과 확장자로 식별된다. (예: hello.py)

  • 실행, 쓰기, 읽기 등을 할 수 있다.

  • 파일의 종류
    기본적인 파일 종류로 text 파일과 binary 파일로 나눈다.

    • 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킨다. (예: pyc파일)
    • 모든 text 파일도 실제는 binary 파일,
      ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있다.


Python File I/O

파이썬은 파일 처리를 위해 “open” 키워드를 사용한다.

파일열기 모드설명
r읽기모드 - 파일을 읽기만 할 때 사용
w쓰기모드 - 파일에 내용을 쓸 때 사용
a추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
f = open("<파일이름>", "접근 모드")
f.close()
  • read(): txt 파일 안에 있는 내용을 문자열로 반환
f = open("i_have_a_dream.txt", "r" ) # 대상파일이 같은 폴더에 있을 경우
contents = f.read()
print(contents)
f.close()

  • with 구문과 함께 사용
with open("i_have_a_dream.txt", "r") as my_file:
    contents = my_file.read()
    print (type(contents), contents)

  • 파이썬의 File Read

한 줄씩 읽어 List Type으로 반환한다.

with open("i_have_a_dream.txt", "r") as my_file:
    content_list = my_file.readlines() #파일 전체를 list로 반환
    print(type(content_list)) #Type 확인
    print(content_list) #리스트 값 출력

  • 실행 시 마다 한 줄 씩 읽어 오기
with open("i_have_a_dream.txt", "r") as my_file:
    i = 0
    while True:
        line = my_file.readline()
        if not line:
            break
        print (str(i) + " === " + line.replace("\n", "")) #한줄씩 값 출력
        i = i + 1

read: 파일 전부를 불러온다.
readlines: \n을 기준으로 자른 다음 List 형태로 불러온다.
readline: 한 줄 씩 불러온다.


  • 파이썬의 File Write
  1. mode는 “w”, encoding=“utf8”
f = open("count_log.txt", 'w', encoding="utf8")
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()
  1. mode는 “a”는 추가 모드 (append)
with open("count_log.txt", 'a', encoding="utf8") as f:
    for i in range(1, 11):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)

os 모듈로 directory 다루기

  • 디렉토리 만들기
import os
os.mkdir("log") # 현재 디렉토리에 log 폴더 생성
  • 디렉토리가 있는지 확인하기
if not os.path.isdir("log"):
    os.mkdir("log")
  • 최근에는 pathlib 모듈을 사용하여 path를 객체로 다룬다.
import pathlib
cwd = pathlib.Path.cwd()
cwd
# WindowsPath('D:/workspace')
cwd.parent
# WindowsPath('D:/')
list(cwd.parents)
# [WindowsPath('D:/')]
list(cwd.glob("*"))
# [WindowsPath('D:/workspace/ai-pnpp'), WindowsPath('D:/workspace/cs50_auto_grader'), WindowsPath('D:/workspace/data-academy'), WindowsPath('D:/workspace/DSME-AI-SmartYard'), WindowsPath('D:/workspace/introduction_to_python_TEAMLAB_MOOC')]

Pickle

파이썬의 객체를 영속화(persistence)하는 built-in 객체

  • 데이터, object 등 실행중 정보를 저장 -> 불러와서 사용
  • 저장해야하는 정보, 계산 결과(모델) 등 활용이 많다.
import pickle
f = open("list.pickle", "wb")
test = [1, 2, 3, 4, 5]
pickle.dump(test, f)
f.close()

f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
print(test_pickle)
f.close()
import pickle
class Mutltiply(object):
    def __init__(self, multiplier):
        self.multiplier = multiplier

    def multiply(self, number):
        return number * self.multiplier

muliply = Mutltiply(5)
muliply.multiply(10)

f = open("multiply_object.pickle", "wb")
pickle.dump(muliply, f)
f.close()

f = open("multiply_object.pickle", "rb")
multiply_pickle = pickle.load(f)
multiply_pickle.multiply(5)


Log Handling

프로그램이 실행되는 동안 일어나는 정보를 기록

  • 유저의 접근, 프로그램의 Exception, 특정 함수의 사용
    Console 화면에 출력, 파일에 남기기, DB에 남기기 등
  • 기록된 로그를 분석하여 의미있는 결과를 도출 할 수 있다.
  • 실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야하는 기록

기록을 print로 남기는 것도 가능하다.

  • 그러나 Console 창에만 남기는 기록은 분석시 사용불가
  • 때로는 레벨별(개발, 운영)로 기록을 남길 필요도 있다.
  • 모듈별로 별도의 logging을 남길필요도 있다.
  • 이러한 기능을 체계적으로 지원하는 모듈이 필요하다.

logging 모듈

Python의 기본 Log 관리 모듈

import logging

logging.debug("틀렸잖아!")
logging.info("확인해")
logging.warning("조심해!")
logging.error("에러났어!!!")
logging.critical ("망했다...")

logging level

프로그램 진행 상황에 따라 다른 Level의 Log를 출력

  • 개발 시점, 운영 시점 마다 다른 Log가 남을 수 있도록 지원한다.
  • DEBUG > INFO > WARNING > ERROR > Critical
  • Log 관리시 가장 기본이 되는 설정 정보
profile
초보 개발자입니다

0개의 댓글