Python/Fundamentals

File/Exception/Log Handling

metamong 2022. 7. 14.

* coursera 강좌에서 exceptiong handling에 대해 간략하게 배웠다. 관련 내용에 대해 좀 더 자세히 알아보자!!

 

 

Python Basics(1). (from Coursera)

1) Python Basics # Types e.g) 11 (int) / 12.32 (float) - can check the specifics of floats 'sys.float_info' / "I love Python" (str) / True, False (bool) → By using the data type, we can see the a..

sh-avid-learner.tistory.com

 

Excpetion Handling

예상 가능한 예외: 발생 여부를 사전에 인지할 수 있는 예외로, 개발자가 반드시 명시적으로 정의해준다!

예상 불가능한 예외: 인터프리터 과정에서 발생하는 예외로, 예를 들어 리스트의 범위를 넘어가는 값 호출, 또는 정수 0으로 나누는 case들이 있으며, 수행 불가 시 인터프리터가 자동으로 호출해준다.

 

→ 따라서 예외가 발생할 때 후속 조치를 위해 exception handling이 필요하다!

(예를 들어 없는 파일 호출하면 파일 없음을 알림, 게임 이상 종료하면 게임 정보를 저장하는 등)

 

★ try - except 구문

 

a = [1,2,3,4,5]

for i in range(10):
    try:
        print(10/i)
        print(a[i])
    except ZeroDivisionError:
        print('Not divided by 0')
    except IndexError as e:
        print(e)
    except Exception as e:
        print(e)

 

→ i가 0일 경우의 exception 잡고(ZeroDivisionError 발생) 다시 위로 가서 계속 code 실행

→ a[i]에서 i값이 4를 넘어갈 경우 IndexError가 발생한다.

→ 그 외의 기타 에러를 잡을 때는 Exception으로 잡음 (권장 x - 사용자 입장에서 어디에서 에러가 발생했는 지 알 수 없으므로)

 

★ try - except -  else 구문: else문은 예외가 발생하지 않을 때 발생하는 코드를 넣는다.

 

★ try - except - finally 구문: finally문은 예외 발생 여부와 상관없이 실행된다.

 

★ 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 예외조건

제대로 함수를 사용하고 있는 지, 도중에 확인차원을 위해 assertion

 

def get_binary_number(decimal_number):
    assert isinstance(decimal_number, int)
    return bin(decimal_number)

print(get_binary_number(10))

File Handling

 

◆ 파일 시스템 = OS에서 파일을 저장하는 트리구조 저장 체계

 

◆ 기본적인 파일 종류로 text 파일과 binary 파일로 나뉜다. 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킨다. 모든 text 파일도 실제는 binary 파일, ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있다.

 

Binary 파일 Text 파일
컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장됨 인간도 이해할 수 있는 형태인 문자열 형식으로 저장됨
일반적으로 메모장으로 열면 내용 깨져 보임 메모장으로 열면 내용 확인 가능
엑셀, 워드 파일 등등 메모장, HTML, python code 파일 등등

 

◆ File I/O - 파일 처리를 위해 'open' 키워드 사용: 접근 모드는 r(읽기모드), w(쓰기모드), a(추가모드)

 

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

 

→ 대상파일이 같은 폴더에 있으면 상대경로를 사용한다. 

 

f = open('i_have_a_dream.txt', "r")
contents = f.read()
print(contents)
f.close()

 

with 구문과 함께 사용

→ with 구문 내 indentation block 내용은 파일이 열려 있는 동안 모두 적용됨. indentation block이 나가면 자동적으로 파일은 닫힘

(별도의 close() 없어도 됨)

 

with open('i_have_a_dream.txt', 'r') as my_file:
    contents = my_file.read()
    print(type(contents), contents)

 

readlines() - 한 줄씩 읽어 반환 (즉, read()는 통째로 가져옴)

 

with open('i_have_a_dream.txt', 'r') as my_file:
    content_list = my_file.readlines()
    print(type(content_list))
    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

 

+ split(" ")을 하면 단어를 분리할 수도 있음 / split("\n")을 하면 한 줄씩 분리됨

 

file write - mode는 'w', encoding은 'utf8' (mode가 a이면 덧붙여 씀)

encoding은 컴퓨터가 문자를 어떤 방식으로 저장하는 지, 표준 종류를 뜻함 (Window는 cp949를 쓰기도)

(* 데이터 저장할 때 encoding을 확인)

 

f = open('count_log.txt', 'w', encoding = 'utf8')
for i in range(1,11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()

 

◆ 파이썬의 디렉토리 다루기 - os module을 사용하여 다루기 (docu로 유용한 함수 많이 배우자 + shutill module로 파일 옮기기 가능)

 

import os
os.mkdir('log')

if not os.path.isdir('log'):
    os.mkdir('log')

#또는 try - except 구문 사용 가능

try:
    os.mkdir('abc')
except FileExistsError as e:
    print('already created')

 

또는 pathlib module을 사용하여 path를 객체로 다룰 수 있다.

Pickle

= '파이썬의 객체를 영속화하는 built-in 객체'

→ 객체는 메모리에 존재하는데, interpreter가 끝나면 메모리에서 사라짐. 따라서 객체를 영원히 메모리에 저장할 수 있게끔

→ 저장해야 하는 정보, 계산 결과(모델) 등 활용이 많음 (class도 메모리에 영속화 저장 가능)

 

import pickle

f = open('list.pickle', 'wb') #binary 파일로 저장
test = [1,2,3,4,5]
pickle.dump(test,f)
f.close()

del test #메모리에서 지움

f = open('list.pickle', 'rb') #읽어옴
test_pickle = pickle.load(f)
print(test_pickle)
f.close()

Logging Handling

Logging이란? 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기는 것으로, 유저의 접근, 프로그램의 exception, 특정 함수를 사용할 때 주로 이용된다. console 화면에 출력, 파일에 남기기, db에 남기기 등등 다양한 case에 사용되며, 기록된 로그를 분석하여 의미있는 결과를 도출할 수 있다. 실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야 하는 기록등등이 해당됨.

 

◎ print와 다른 점은, console 창에만 남기는 기록은 분석 시 사용이 불가능하기 때문이다 (다 사라지므로), 따라서 때로는 레벨별(개발,운영)로 기록을 남길 필요도 있다. 모듈별로 별도의 로깅을 남길 필요도 있으며, 이러한 기능을 체계적으로 지원하는 모듈이 필요하다.

 

  logging module

 

import logging

logging.debug('틀렸잖앙!')
logging.info('확인해')
logging.warning('조심')
logging.error('에러났음')
logging.critical('망했슴')

 

→ logging level: 프로그램 진행 상황에 따라 다른 level의 log를 출력하며, 개발 시점, 운영 시점마다 다른 log가 남을 수 있도록 지원한다. debug > info > warning > error > critical. log 관리 시 가장 기본이 되는 설정 정보가 로깅 레벨

(기본 로깅 레벨은 warning 이상 - operation level에서 사용자에게 알려줌 - basicConfig에서 level인자를 다르게 설정하면 됨)

 

 

◎ 환경을 미리 설정 - configparser(파일 설정) & argparser(실행 시점 설정)

 

①  configparser - 프로그램 실행 설정을 file에 저장함. section, key, value 값의 형태로 설정된 설정 파일을 사용. 설정파일을 dict type으로 호출 후 사용 (cfg 파일)

② argparser - console 창에서 프로그램 실행 시 setting 정보 저장, 거의 모든 console 기반 파이썬 프로그램 기본으로 제공, 특수 모듈도 많이 존재하지만(TF), 일반적으로 argparse를 사용, command-line option이라고 부름


* 출처) 네이버 AI Tech 강좌

* 썸네일 출처) https://www.istockphoto.com/kr/%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8/exception

'Python > Fundamentals' 카테고리의 다른 글

λ 표현식  (0) 2022.08.21
list, string, tuple, dictionary, set (iterables)  (0) 2022.08.19
python OOP  (0) 2022.07.07
Python Basics(2). (from Coursera)  (0) 2022.04.13
Python Basics(1). (from Coursera)  (0) 2022.04.04

댓글