Boostcamp AI Tech (Day 005)
1. Exception / File / Log handling
1.1 Exception handling
- 예상 가능한 예외
- 사전에 인지 가능
- ex. 사용자의 잘못된 입력, 파일 호출 시 파일 없음
- 개발자가 반드시 명시적으로 정의
- 예상 불가능한 예외
- 인터프리터 과정에서 발생, 개발자 실수
- ex. 리스트 범위를 넘어가는 값 호출, divided by 0
- 수행 불가 시 인터프리터가 자동 호출
- Exception handling
- try ~ except
a = [1, 2, 3, 4, 5] for i in range(10): try: print(10 / i) print(a[i]) print(v) except ZeroDivisionError: print("Error") print("Not divided by 0") except IndexError as e: print(e) # 전체 exception을 잡아버리면 error가 정확하게 어디서 발생했는지 찾기 힘들다 except Exception as e: print(e) # else: 예외가 발생하지 않을 시 실행됨 # finally: 예외 발생 여부와 상관없이 실행됨
Built-in exceptions: IndexError, NameError, ZeroDivisionError, ValueError, FileNotFoundError
- raise
while True: value = input("Input a number:") for digit in value: if digit not in "0123456789": raise ValueError("Not a digit") print("int(number) -", int(value))
- assert
def get_binary_number(decimal_number): assert isinstance(decimal_number, int) # 특정 조건(isinstance)을 만족하지 않을 경우 예외 발생시킴 return bin(decimal_number) print(get_binary_number(10))
- try ~ except
1.2 File handling
File: 의미 있는 정보를 담는 논리적 단위. 기본적인 파일 종류로 text file, binary file이 있음.
File system: OS에서 파일을 저장하는 트리구조 저장 체계
- python file I/O
- r (읽기 모드), w (쓰기 모드), a (추가 모드, 파일 마지막에 새로운 내용 추가)
f = open("sample.txt", "r") # 주소 연결 contents = f.read() print(contents) f.close()
with open("sample.txt", "r", encoding="utf8") as f: contents = f.read() print(contents)
- readlines(): 파일 전체를 list로 반환
- 실행 시 마다 한 줄씩 읽어오기
with open("sample.txt", "r") as f: i = 0 while True: line = f.readline() if not line: break print(str(i) + " === " + line.replace("\n", "")) i += 1
- r (읽기 모드), w (쓰기 모드), a (추가 모드, 파일 마지막에 새로운 내용 추가)
- os module
import os try: os.mkdir("folder") except FileExistsError as e: print("Already created") os.path.exists("folder") os.path.isfile("file.py")
- shell util module
import shutil source = "sample.txt" dest = os.path.join("folder", "file.py") shutil.copy(source, dest) # 파일 복사
- pathlib module
import pathlib # path를 객체로 다룰 수 있음 cwd = pathlib.Path.cwd() cwd.parent list(cwd.glob("*"))
- create log file
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("Log starts\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) + "created log" + "\n" f.write(log_line)
- pickle
- python 객체를 persistent(영속화)하게 하는 built-in 객체
- data, object 등 실행 중 (메모리에 있는) 정보/계산결과(모델) 등 저장
import pickle f = open("list.pickle", "wb") test = [1, 2, 3] pickle.dump(test, f) f.close() f = open("list.pickle", "rb") test_pickle = pickle.load(f) print(test_pickle) f.close()
1.3 Log handling
-
logging
- 프로그램이 실행되는 동안 일어나는 정보를 기록
- 유저 접근, 프로그램 exception, 특정 함수 사용 등
- console 화면에 출력, 파일 남기기, db에 남기기 등
- logging module
import logging logging.debug() # 개발시 처리 기록 logging.info() # 처리가 진행되는 동안의 정보 알림 logging.warning() # 사용자 wrong input 등 발생 시 알림 logging.error() # 잘못된 처리로 에러 발생 시 (프로그램 동작에는 문제 없음) logging.critical() # 잘못된 처리로 데이터 손실이나 프로그램 동작 불가 시 알림
사전 설정: 데이터 파일 위치, 파일 저장 장소, operation type 등
- configparser
- 프로그램의 실행 설정을 file에 저장
- section, key, value 값의 형태로 설정된 설정 파일 사용
- 설정파일을 dict type으로 호출 후 사용
- key: value 혹은 key=value 형식으로 parse
- argparser
- console 창에서 프로그램 실행 시 setting 정보 저장
- 대부분의 console 기반 python program은 기본으로 제공
- command-line option
- “-v”, “-l” 등 실행 시 옵션 추가
- logging formmater
- formatter = logging.Formatter(‘%(asctime)s %(levelname)s %(process)d %(message)s’)
- log config file
[loggers]
keys=root
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
2. Python data handling
2.1 CSV (comma separate value)
- 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식
- TSV(tab), SSV(space)
- open(), readline() 으로 불러와 처리도 가능하지만 한계가 있다
- csv 객체 활용 (import csv)
- csv.reader(file), for row in csv_data
- delimiter=’\t’
2.2 Web
- WWW (World Wide Web)
- HTTP protocal: 데이터 송수신
- HTML 형식: 데이터 표시
- 요청(웹주소, form, header) -> 처리(db) -> 응답(html, xml) -> 렌더링(html, xml)
- HTML
- 웹 상의 정보를 구조적으로 표현
- tag 형태로 구성
- 트리 모양의 포함관계
- 일반적으로 html 소스파일을 컴퓨터가 다운로드 후 웹 브라우저가 해석
- 태그 특징을 이용해 정규식으로 파싱 가능
regular expression (정규식)
- regexp, regex
- 복잡한 문자열 패턴을 정의하는 문자 표현 공식
- 특정한 규칙을 가진 문자열 집합을 추출
- regexr.com
- urllib, re
import urllib.request import re url = "https://..." html = urllib.request.urlopen(url) html_contents = str(html.read().decode("ms929")) stock_results = re.findall("(\dl class=\"blind\">)([\s\S])...", html_contents)
- XML (eXtensible Markup Language)
- 데이터의 구조의 의미를 설명하는 tag (MarkUp)를 사용해 표시하는 언어
- 정보의 구조에 대한 정보인 스키마와 DTD 등으로 메타정보가 표현됨
- 용도에 따라 다양한 형태로 변경가능
- pc to mobile, mobile to pc 정보 교류에 매우 유용한 저장 방식
- html과 같은 구조적 markup 언어
- 정규표현식으로 parsing 가능하지만, beautifulsoup 등 편리한 parser 존재
from bs4 import BeautifulSoup with open("~.xml", "r", encoding="utf8") as file: file_xml = file.read() soup = BeautifulSoup(file_xml, "lxml") # lxml parser로 데이터 분석 for info in soup.find_all("search"): print(info) print(info.get_text())
- JSON (JavaScript Object Notation)
- javascript의 데이터 객체 표현 방식
- 간결하고 데이터 용량이 작고 code로 전환이 쉬움
- {“key”:”value”} 형태로 dict type과 상호 호환
- import json (json.loads())
3. Assignment 해설발표
- 조교님 해설 발표 이후, 지원해서 내 코드를 발표함
- 가독성 좋은 코드라고 칭찬받아 매우 기뻤다!
def main():
"""
* Flags *
play_flag: continue playing game or not
random_number_exist: there is already a random number to play
"""
print("Play Baseball")
play_flag = True
random_number_exist = False
while play_flag:
# get new random number
if not random_number_exist:
random_number = str(get_not_duplicated_three_digit_number())
print("Random Number is : ", random_number)
random_number_exist = True
user_input = input('Input guess number : ')
# exit game / wrong input
if user_input == '0':
break
if not is_validated_number(user_input):
print("Wrong Input, Input again")
continue
strike, ball = get_strikes_or_ball(int(user_input), int(random_number))
print("Strikes : {} , Balls : {}".format(strike, ball))
while strike == 3:
re_input = input('You win, one more(Y/N)?')
if is_yes(re_input):
random_number_exist = False
break
if is_no(re_input):
play_flag = False
break
print("Wrong Input, Input again")
print("Thank you for using this program")
print("End of the Game")