now is better than never

[인공지능(AI) 기초 다지기] 2. 파이썬 다지기 (3) 본문

Python/[코칭스터디 9기] 인공지능 AI 기초 다지기

[인공지능(AI) 기초 다지기] 2. 파이썬 다지기 (3)

김초송 2023. 1. 29. 15:11

5. 파이썬으로 데이터 다루기

- Exception

  1. 예상 가능한 예외 -> IF문 처리
    • 발생여부를 사전에 인지할 수 있는 예외
    • 개발자가 반드시 명시적으로 정의해야 함
    • 사용자의 잘못된 입력, 파일 호출 시 파일 없음
  2. 예상 불가능한 예외 -> Exception Handling
    • 인터프리터 과정에서 발생하는 예외, 개발자 실수
    • 수행 불가 시 인터프리터가 자동 호출
    • 리스트의 범위를 넘어가는 값 호출, 정수 0으로 나눔

 

- Exception Handling

try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생 시 대응하는 코드
except Exception as e: # 맨 마지막에 발생 가능한 모든 예외 처리하는 코드 -> 권장하지 않음
	print(e)
else:
	예외가 발생하지 않을 때 동작하는 코드
finally:
	예외 발생 여부와 상관없이 실행되는 코드
  • try = if / else = except 비슷
  • 에러로 인한 시스템 종료를 방지 -> 안정적으로 프로그램 실행
  • Built-in Exception : 기본적으로 제공하는 예외
Exception 명  내용
IndexError List의 Index 범위를 넘어갈 때
NameError 존재하지 않는 변수를 호출할 때
ZeroDivisionError 0으로 숫자를 나눌 때
ValueError 변환할 수 없는 문자/숫자를 변환할 때
FileNotFoundError 존재하지 않는 파일을 호출할 때
  • IF문 : 로직 처리
    Exception : 에러 발생(사용자의 잘못된 입력 등) 처리

 

- 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_number(decimal_number):
    assert isinstance(decimal_number, int) # True / False 반환 -> False면 에러 발생
    return bin(decimal_number)

print(get_binary_number(10))

 

- File Handling

  • file system: OS에서 파일을 저장하는 트리구조 저장 체계
Binary 파일 Text 파일
컴퓨터만 이해할 수 있는 형태인 이진형식으로 저장된 파일 인간도 이해할 수 있는 형태인 문자열 형식으로 저장된 파일
일반적으로 메모장으로 열면 내용이 깨짐 메모장으로 내용 확인 가능
엑셀파일, 워드 파일 메모장 파일, HTML 파일, 파이썬 코드 파일
  • 컴퓨터는 text 파일을 처리하기 위해 binary 파일로 변환시킴
  • 모든 text 파일도 실제는 binary 파일, ASCII/Unicode 문자열 집합으로 저장되어 사람이 이해할 수 있음

 

- Python File I/O

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

f = open("text.txt", "r") # 대상 파일이 같은 폴더에 있는 경우 = 상대 경로
contents = f.read()
print(contents)
f.close()

with open("text.txt", "r") as my_file:
    contents = my_file.read()
    print(type(contents), contents)
접근 모드 설명
r 읽기 모드 - 파일을 읽기만 할 때
w 쓰기 모드 - 파일에 내용을 쓸 때
a 추가 모드 - 파일의 마지막에 새로운 내용을 추가
  • read() : txt 파일 안에 있는 내용을 문자열로 반환
  • with 구문 : 들여쓰기 된 구문 안에서만 변수가 사용되고 구문이 끝나면 close 됨
  • .readlines() : 줄로 구분하여 파일 전체를 list로 반환
# 실행 시 마다 한 줄 씩 읽어오기
# 너무 대용량이라 한꺼번에 파일을 읽어오기 오래걸리거나 메모리가 부족할 때
with open("text.txt", "r") as my_file:
    i = 0
    while True:
    	line = my_file.readline()
        if not line:
        	break
        print(str(i) + "===" + line.replace("\n", "")) # 한 줄 씩 값 출력
        i += 1
# 단어 통계 정보 산출

 

- OS module

# row 폴더 생성
import os
os.mkdir("폴더명")

# 폴더 확인
os.path.exists("폴더명")
os.path.isdir("폴더명")

 

- Log 파일 생성하기

  1. 디렉토리가 있는지 확인
  2. 파일이 있는지 확인
    없으면 'w' 있으면 'a'
import os
if not os.path.isdir("log"):
    os.mkdir("log")
if not os.path.exists("log/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 객체
    객체는 원래 메모리에 있어야 함 -> 원래 종료 후에는 메모리에서 사라지는 객체를 영속화
  • 데이터, object 등 실행 중 정보를 저장하고 불러와서 사용
  • 저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
  • 파이썬에 특화된 binary file : 접근모드+"b" ("wb", "rb")
  • 영속화 : 파이썬에서 쓰는 하나의 객체(리스트, 클래스 등)을 파일로 저장

 

- Logging Handling

  • logging (로그 남기기)
    • 프로그램이 실행되는 동안 일어나는 정보를 기록하기
    • 무엇을?
      유저의 접근, 프로그램의 Exception, 특정 함수 사용 등
    • 어디에?
      Console 화면에 출력, 파일에 남기기, DB에 남기기 등
    • 기록된 로그를 분석하여 의미있는 결과를 도출할 수 있음
    • 실행시점에서 남겨야 하는 기록, 개발시점에서 남겨야 하는 기록(에러)
  • print vs logging
    • 기록을 print로 남기는 것도 가능
    • 그러나 console 창에만 남기는 기록은 분석 시 사용 불가
    • 모듈별 / 레벨별(개발, 운영)로 기록을 남길 필요
  • logging level
    • 프로그램 진행 상황에 따라 다른 level의 log 출력
    • 개발 시점, 운영 시점마다 다른 log가 남을 수 있도록 지원
    • DEBUG > INFO > WARNING > ERROR > CRITICAL
      개발       > 운영  > 사용자
    • log 관리시 가장 기본이 되는 설정 정보
Level 개요 예시
debug 개발 시 처리 기록을 남겨야 하는 로그 정보 다음 함수로 A 호출
변수 A를 B로 변경
info 처리가 진행되는 동안의 정보 서버 시작
서버 종료
사용자 A가 프로그램 접속
warning 사용자가 잘못 입력한 정보
처리는 가능하나 원래 의도와 다른 정보
str 입력을 해야 하는 곳에 int 입력 -> str casting
이차원 리스트에 일차원 리스트 -> 차원 변환
error 잘못된 처리로 인한 에러지만 프로그램 동작 가능 파일 없음 -> Excepton 처리 후 사용자에게 알림
외부서비스 연결 불가
critical 잘못된 처리로 데이터 손실이나 프로그램 동작 불가능 잘못된 접근으로 파일 삭제
사용자에 의한 강제 종료

 

- Configparser

  • 프로그램 실행 설정(log)를 file에 저장
  • Section, Key, Value 값의 형태로 설정된 설정 파일을 사용
  • 설정파일을 Dict Type으로 호출 후 사용
  • 섹션 - []
    속성 - key : value / key = value
# configparser file - example.cfg
'''
[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True
[SectionTwo]
FavoriteColor = Green
[SectionThree]
FamilyName: Johnson
'''

import configparser
config = configparser.ConfigParser()
config.sections()

config.read('example.cfg')
config.sections()

for key in config['SectionOne']:
    print(key)

config['SectionOne']["status"]

# key value 쌍
for key in config['SectionTwo']:
    value = config['SectionTwo'][key]
    print("{0} : {1}".format(key, value))

 

- Argparser

  • Console 창에서 프로그램 실행 시 setting 정보를 저장
  • 거의 모든 Console 기반 python 프로그램 기본으로 제공
  • 특수 모듈도 많이 존재하지만(TF), 일반적으로 argparser를 사용
  • Command-Line Option 이라고 부름
  • (argument를 사전에 입력하면서 사용사가 실험을 할 수 있게 함)
import argparse

parser = argparse.ArgumentParser(description='Sum two integers.')

parser.add_argument('-a', "--a_value", dest=”A_value", help="A integers", type=int)
parser.add_argument('-b', "--b_value", dest=”B_value", help="B integers", type=int)

args = parser.parse_args()
print(args)
print(args.a)
print(args.b)
print(args.a + args.b)

 

- Logging formatter

  • Log이 결과값의 format을 지정해줄 수 있음
import logging

formatter = logging.Formatter('%(asctime)s %(levelname)s %(process)d %(message)s')

# log config file
logging.config.fileConfig('logging.conf')
logger = logging.getLogger()