본문 바로가기
AI Basic/Python

[Python] 08 File & Exception & Log Handling

by iamzieun 2023. 3. 8.

01 Exception Handling

01-1 Exception

  • 예상 가능한 예외와 예상 불가능한 예외
    • 예상 가능한 예외
      • 발생 여부를 사전에 인지할 수 있는 예외
        • ex. 사용자의 잘못된 입력,
      • → 개발자가 반드시 명시적으로 정의해야 함
    • 예상 불가능한 예외
      • 인터프리팅 과정에서 발생하는 예외
  • 예외 처리 Exception Handling
    • 프로그램은 제품이므로, 모든 잘못된 상황에 대한 대처가 필요
  • exception의 종류
    • Built-in Exception 예시  
      Exception 이름 내용
      IndexError list의 index 범위를 넘어갈 때
      NameError 존재하지 않는 변수를 호출할 때
      ZeroDivisionError 0으로 숫자를 나눌 때
      ValueError 변환할 수 없는 문자/숫자를 변환할 때
      FileNotFoundError 존재하지 않는 파일을 호출할 때

01-2 Exception handling

  • try - except 문
    • if - else 문과 유사한 형태
try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생 시 대응하는 코드
  • try - except - else 문
try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생 시 대응하는 코드
else:
	예외가 발생하지 않을 때 동작하는 코드
  • try - except - finally 문
try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생 시 대응하는 코드
finally:
	예외 발생 여부와 상관없이 동작하는 코드
  • raise 구문: 강제로 Exception을 발생 시킴
raise <Exception Type>("예외 정보")
  • assert 구문: 특정 조건을 만족하지 않는 경우 Exception을 발생 시킴
assert 예외조건
# example
def get_binary_number(decimal_number):
    assert isinstance(decimal_number, int)  # decimal_number가 int가 아닌 경우 Exception
    return bin(decimal_number)

print(get_binary_number("지은"))             # AssertionError

02 File Handling

02-1 File

  • 파일 시스템 file system
    • OS에서 파일을 저장하는 트리 구조의 저장 체계
  • 파일 file
    • 컴퓨터 등의 기기에서 의미 있는 정보를 담는 논리적인 단위
    • 파일은 파일명과 확장자로 식별됨
      • ex. hello.py
        • hello: 파일명
        • py: 확장자
  • 디렉토리 directory
    • 파일과 다른 디렉토리를 포함할 수 있음
  • 파일의 종류  
    binary 파일 text 파일
    컴퓨터만 이해할 수 있는 형태인 이진(법)형식으로 저장된 파일 사람이 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
    일반적으로 메모장으로 열면 내용이 깨져 보임 메모장으로 내용 확인 가능
    엑셀 파일, 워드 파일 등 html 파일, 파이썬 코드 파일 등
    → 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킴

02-2 File Handling

  • File I/O
f = open("파일 이름", "접근 모드")
f.close()
    • 접근 모드
      • r: read. 읽기 모드
      • w: write. 쓰기 모드
      • a: append. 추가 모드
  • File Read
    • open과 close 사용
    • with 구문과 open을 함께 사용
      • close 없이도 ok
with open("filename.txt", "r") as my_file:
	contents = my_file.read()
	print(type(contents), contents)
  • File Write
    • mode=“w”
      • encoding
        • 맥 / 리눅스: utf8
        • 한글 윈도우: cp949
f = open("count_log.txt", 'w', encoding="utf8") 
for i in range(1, 11):
	data = "%d번째 줄입니다.\\n" % i
	f.write(data) 
f.close()
    • mode=”a”
with open("count_log.txt", 'a', encoding="utf8") as 
f: for i in range(1, 11):
	data = "%d번째 줄입니다.\\n" % i 
	f.write(data)

02-3 Directory Handling

  • OS 모듈 활용
    • directory 생성
import os
os.mkdir("log")    # log라는 이름의 directory 생성
    • directory가 있는지 확인
import os
os.path.exists("log")    # log directory가 있으면 True
  • shutil 모듈 활용 
    • 파일 복사
import shutil
source = "i_have_a_dream.txt"
new = os.path.join("abc", "jieun.txt")    # os.path.join: 경로 연결
shutil.copy(source, new)                  # source를 new로 복사
      • cf. 왜 abc\\jieun.txt라고 쓰지 않고 os.path.join 함수를 사용할까?
      • os마다 경로 지정 방식이 다르기 때문 !
  • pathlib 모듈 활용
    • 현재 directory / 상위 directory 확인
import pathlib
cwd = pathlib.Path.cwd()    # cwd(): current working directory
cwd.parent                  # 현재 directory의 상위 directory
  • log 파일 생성하기
# 로그 파일 생성
import os
if not os.path.isdir("log"):                    # log 디렉토리 존재 여부 확인
    os.mkdir("log")
if not os.path.exists("log/count_log.txt"):     # count_log.txt 파일 존재 여부 확인
    f = open("log/count_log.txt", "w", encoding="utf8")
    f.write("기록이 시작됩니다\\n")
    f.close()

# 로그 기록
with open("log/count_log.txt", "a", 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)
  • pickle
    • 파이썬의 객체를 영속화(persistence)하는 built-in 객체
      • 객체는 메모리에 저장되므로 파이썬 인터프리터가 종료되면 객체도 사라짐
      • → 파이썬 인터프리터 종료 이후에도 다시 객체를 사용하기 위하여 pickle을 사용
      import pickle
      
      # pickle file 생성
      f = open("list.pickle", "wb")   # wb: write binary
      test = [1, 2, 3, 4, 5]
      pickle.dump(test, f)
      f.close()
      
      # 생성한 pickle file 불러와서 사용
      f = open("list.pickle", "rb")   # read binary
      test_pickle = pickle.load(f)
      print(test_pickle).             # [1, 2, 3, 4, 5]
      f.close()
      

03 Log Handling

03-1 Logging

  • Logging
    • 프로그램이 실행되는 동안 발생되는 정보기록으로 남기기
      • 프로그램이 실행되는 동안 발생되는 정보: 유저의 접근, 프로그램의 exception, 특정 함수의 사용 등
      • 기록으로 남기기: console 화면에 출력, 파일로 남기기, DB에 남기기 등
      • cf. 기록의 분류
        • 실행시점에서 남겨야 하는 기록 → for 유저 분석
        • 개발시점에서 남겨야 하는 기록 → for debugging
  • print vs logging
    • console 화면에 출력함으로써 기록을 남길 수 있음
    • 하지만, console에만 기록을 남길 경우 이후 분석 등에 사용할 수 없음
    ⇒ 단계별 / 모듈별로 체계적으로 log를 관리하는 모듈 필요
  • logging 모듈
import logging
logging.debug("틀렸잖아!") 
logging.info("확인해") 
logging.warning("조심해!") 
logging.error("에러났어!!!") 
logging.critical ("망했다...")
  • logging level
    • log 관리 시 가장 기본이 되는 설정 정보
    • DEBUG > INFO > WARNING > ERROR > Critical
  • logging을 위해 필요한 설정
    • 데이터 파일 위치
    • 파일 저장 위치
    • operation type 등
    → 이러한 설정을 위해 필요한 것이 configparser, argparser

03-2 configparser

  • config file
# example.cfg
[SectionOne]   # Section
Name: Hailey   # key:value 형태로 속성 저장
Value: Yes
Age: 23

[SectionTwo]
Color: blue

[SectionThree]
FamilyName: Park
  • configparser file
import configparser
config = configparser.ConfigParser()
config.read('example.cfg')
config.sections()    # ['SectionOne', 'SectionTwo', 'SectionThree']

for key in config['SectionTwo']:
	print(key)         # Color

config['SectionOne']['Name'] # Hailey

03-3 argparser

  • console 창에서 프로그램 실행 시 setting 정보를 저장함

 

 

'AI Basic > Python' 카테고리의 다른 글

[Python] 09 Data Handling  (0) 2023.03.08
[Python] 07 Python Object Oriented Programming  (0) 2023.03.07
[Python] 06 Pythonic Code  (0) 2023.03.07
[Python] 05 Python Data Structure  (0) 2023.03.07
[Python] 04 Advanced Function Concept  (0) 2023.03.07

댓글