[BoostCamp AI Tech / Day 3] File / Exception / Log Handling

newbie·2021년 8월 4일
0

[boostcampAI U stage] week1

목록 보기
10/21

Exception

  • 예상 가능한 예외
    • 발생 여부를 사전에 인지할 수 있는 예외(전화번호, 이름, 주소 등)
    • 사용자의 잘못된 입력, 파일 호출 시 파일 없음 등
    • 개발자가 반드시 명시적으로 정의해야 함
    • if 문으로 처리
  • 예상 불가능한 예외
    • 인터프리터 과정에서 발생하는 예외, 개발자 실수
    • 리스트의 범위를 넘어가는 값 호출
    • 수행 불가 시 인터프리터가 자동 호출
    • 예외 처리(Exception Handling)
      • 게임이 이상종료 되었을 경우 종료되기 전 저장을 하는 등

Excetion Handling(파이썬의 예외 처리)

try ~ except 문법

try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생시 대응 코드
  • if-else 구문으로도 처리할 수 있지만 exceptiong handling을 권장하는 경우도 있음
for i in range(10):
   try:
       print(10/i) # i = 0 일때 나눌 수 없어서 exception이 발생
   except ZeroDivisionError: # 이 때 해당 exception을 캐치하여 어떤 해당 조건과 맞는 exception일 경우 대응 코드로 진행
       print("Not divided by 0")
   except Exception as e:
       print(e) #다른 exception이 발생할 경우 어떤 error인지 파악하기 위해, 일반적으로 마지막 except에 해당 코드를 추가해줌
                # 단, 이렇게 모든 exception을 잡게 될 경우 어디서 error가 발생한지 명확하지 않으므로 좋은 코드는 아님
                  # 초기 코드 작성 경우에만 사용할 것
  • ZeroDivisionError과 같은 error는 built-in error로 파이썬에서 이러한 에러가 발생할 수 있으니 처리를 하겠다고 선언
  • 만약 except 부분에 다른 error 조건을 지정할 경우 error를 못잡음
  • built-in exception(기본적으로 제공하는 예외) 종류
    • IndexError : data의 index 범위를 넘어갈 때
    • NameError : 존재하지 않는 변수를 호출할 때
    • ZeroDivisionError : 0으로 나눌 때
    • ValueError : immutable data를 변환할 때
    • FileNotFoundError : 존재하지 않은 파일을 호출할 때
    • 이외에 다양한 빌트인 함수 존재
      (https://docs.python.org/3/library/exceptions.html)

try ~ except ~ else

try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생 시 동작하는 코드
else:
    예외가 발생하지 않을 때 동작하는 코드
  • 구조가 조금 복잡하여 가독성이 떨어짐(사용을 권장하진 않음)

try ~ except ~ (else) ~ finally

try:
    예외 발생 가능 코드
except <Exception Type>:
    예외 발생 시 동작하는 코드
finally:
    예외 발생 여부와 상관없이 동작하는 코드
  • 구조가 조금 복잡하여 가독성이 떨어짐(사용을 권장하진 않음)

if-else vs try~except:

  • if~else : 논리적으로 문제를 다룰 떄 사용
  • try~except : 데이터가 잘못 됐거나 사용자가 잘못 입력하는 등 잘못된 경우일 때 사용

raise 구문

  • 필요에 따라 강제로 Exception을 발생
  • 공개한 소스 코드를 다른 사람들이 사용할 때, 잘못 사용할 경우를 발지
  • 잘못 사용한 경우 강제로 if문을 종료하여 리소스 손실을 방지
raise <Exception Type>(예외 정보)

while True:
    value = input("변환할 정수 값을 입력: )
    for digit in value:
        if digit not in "0123456789":
            raise ValueError("숫자값을 입력하지 않으셨습니다")
    print("정수값으로 변환된 숫자 -", int(value))

assert 구문

  • 특정 조건에 만족하지 않을 경우 예외 발생
asswer 예외조건

def get_binary_number(decimal_number : int):
    assert isinstance(decimal_number, int)
    # 타입 힌트를 넣어줬더라도 사용자가 잘못 입력한 경우가 있음
    # 이럴 isinstance()로 True or False가 출력되는데
    # False일 경우 Error를 출력하고 진행을 멈춤
    # 에러가 발생할 경우 다음 과정을 진행할 필요가 없으므로 리소스 방지를 위해 멈춰줌
    return bin(decimal_number)

print(get_binary_number(10)


File Handling

파일의 종류

  • 기본적인 파일 종류로 text 파일과 binary 파일로 나눔
  • 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킴(예 : pyc 파일)
  • 모든 text 파일도 실제로는 binary 파일, ASCII\Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있음
  • binary 파일 vs Text 파일
    • binary 파일
      • 컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일
      • 일반적으로 메모장으로 열면 내용이 깨짐
      • 엑셀, 워드 파일 등등...
    • Text 파일
      • 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
      • 메모장으로 확인 가능
      • .txt파일, html파일, 파이썬 코드 파일 등

Python File I/O

  • 파이썬은 파일 처리를 위해 "Open" 키워드 사용

    f = open("<파일이름>", "접근 모드")
    f.close()

  • 접근 모드

    • r : 읽기 모드
    • w : 쓰기 모드
    • a : 추가 모드(파일의 마지막에 새로운 내용 추가)
  • file read

    • read() text 파일 안에 있는 내용을 문자열로 변환
    • with 구문과 함께 사용 가능
      • with 구문으로 쓸 경우 with 하위의 코드는 indentation이 필수이며, indentation있는 동안 해당 open 유지, indentation을 없는 순간부터 자동으로 close()됨
    f = open("dream.txt","r") #대상 파일이 같은 폴더에 있을 경우
    contents = f.read() 
    f.close()
    
    with open("dream.txt","r") as my_file:
        contents = my_file.read()
    • 한줄씩 읽어 List type으로 반환
    with open("dream.txt","r") as my_file:
        contents = my_file.readlines() #파일 전체를 list로 반환
    • 실행 시마다 한줄씩 읽어 List type으로 반환
    with open("dream.txt","r") as my_file:
        i = 0
        while True:
            line = my_file.readline() #한 줄씩 읽어옴
            if not line:
                break
            print(str(i) + "===" + line.replace("\n",""))
    - read, readlines, readline
      - read : 통째로 읽음
      - readlines : 띄어쓰기 기준으로 한 줄씩 읽어서 list에 저장
      - readline : 한 줄씩 읽음
        - readlines는 실행 시 모든 라인을 데이터에 올리는데 대용량 데이터 처리 시 매우 느림
        - 그럴 때 한줄씩 읽어서 메모리에 올리는 readline이 좋음
  • File Write

    • mode = "w", encoding = "utf-8" #문자나 글자를 컴퓨터에 저장할 때 표준 지정
      • linux&mac : utf-8 // windows : cp949
    f = open("count_log.txt","w",encoding = "utf8")
    for i in range(1,11):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)
    f.close()
    
    with open("dream.txt","w",encoding = 'utf8') as my_file:
        for i in range(1,11):
        data = "%d번째 줄입니다.\n" % i
        f.write(data)

파이썬 directory 다루기

  • os 모듈을 사용하여 directory 다루기
import os
if not os.path.isdir("log"): #디렉토리 있는지 확인
    os.mkdir("log") #디렉토리 생성
# os.path.isdir( ) == os.path.exists( )

try:
    os.mkdir("abc")
except FileExistError as e:
    print("Already created")

os.path.isfile() #파일 존재 여부 확인

import shutil
source = "file.ipynb" #현재 위치에 있는 파일 명
dest = os.path.join("abc", "file1.ipynb")
# 경로 생성 => abc\\file.ipynb
# join구문을 사용하는 이유 : os가 다를 경우 발생할 문제 방지
# directory구분 => windows : \, mac : /
shutil.copy(source, dest) #source 파일을 해당 위치의 지정한 파일명으로 복사
  • 최근에는 shutil 보단 pathlib을 사용함
    • path를 객체로 다뤄서, os에 따른 경로 separator를 통일시켜 줌
import pathlib
cwd = pathlib.Path.cwd() #현재 위치의 절대 경로를 저장
cwd.Parent # 상위 디렉토리 출력
list(cwd.Parents) # 현재 위치부터 최상단 위치까지 디렉토리 경로 출력
cwd.glob("*") # 현재 폴더의 모든 파일을 절대경로와 함께 출력

Log 파일 생성하기

  • 디렉토리가 있는지 + 파일이 있는지 확인 후
import os
if not os.path.isdir("log"):
    os.mkdir("log")
    
target_file_path = os.path.join("log", "count_log.txt")
if not os.path.exists(target_file_path):
    f = open("log/count_log.txt", "w", encoding = "utf8")
    f = write("기록이 시작됩니다 \n")
    f.close()

with open(target_file_path, "w", encoding = "utf8") as f:
    import random, datetime
    for i in range(1,11):
        stamp = str(datetime.datetime.now())
        value = random.random() * 1000000
        log_line = stamp + "\t" + str(value) + "값이 생성되었습니다" + "\n"
        f.write(log_line)

log 남기기(실습)

  • 5-1의 42분부터) 이후 내용은 vscode로 실습

Pickle

  • 객체는 기본적으로 메모리에 저장되고, 파이썬 인터프리터가 종료 시 삭제됨

  • 이 때, 해당 객체를 추후에도 사용하려고 할 때 객체를 외부에 저장해야 함

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

  • 데이터,object, 모델 등을 저장하고 불러와서 사용하는 기능을 제공

  • binary 파일로 txt로 열 수 없음

    import pickle
    
    #write
    f = open("tmp.pickle",wb") #wb : write binary
    test = [1,2,3]
    pickle.dump(test,f)
    f.close()
    
    #read
    f = open("tmp.pickle", "rb") #rb : read binary
    test = pickle.load(f)
    f.close()
profile
DL, NLP Engineer to be....

0개의 댓글

관련 채용 정보