해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성철 교수님 - File / Exception / Log Handling
1) Exception
예외(Exception)는 예상이 가능한 예외, 예상 불가능한 예외로 나눌 수 있습니다. 예상 가능한 예외는 사전에 발생 여부를 인지할 수 있는 예외입니다. 예상 가능한 예외는 if문을 통해서 핸들링할 수 있습니다. 예상 불가능한 예외는 인터프리터 과정에서 발생하는 예외입니다. 리스트의 범위를 넘어가는 값을 호출하거나 0으로 나누는 것들이 이에 해당됩니다. 이런 경우 프로그램에서 인터프리터가 알아서 에러를 호출해주고 프로그램을 종료시킵니다. 예상 불가능한 예외는 exception을 통해서 핸들링할 수 있습니다.
파이썬의 예외처리에는 try - except 구문을 활용합니다. try-except 구문은 아래와 같이 활용 가능합니다.
try:
예외 발생 가능한 코드
except <Exception Type>:
예외 발생했을 때 대응하는 코드
아래의 예시를 실행해보면 i가 0일 때, ZeroDivisionError가 발생하면서 "Not divided by 0"가 나옵니다. 그다음에 1~10까지는 이상 없이 실행이 되기 때문에 try 내부의 print문이 돌아가게 됩니다.
for i in range(10):
try:
print(10 / i)
except ZeroDivisionError: #built-in Error
print("Not divided by 0")
ZeroDivisionError는 built-in Exception으로 기본적으로 제공하는 예외입니다. 이러한 built-in Exception에는 다음과 같은 종류가 존재합니다.
Exception 이름 | 내용 |
IndexError | List의 Index 범위를 넘어갈 때 |
NameError | 존재하지 않는 변수를 호출할 때 |
ZeroDivisionError | 0으로 숫자를 나눌 때 |
ValueError | 변환할 수 없는 문자/숫자를 변환할 때 |
FileNotFoundError | 존재하지 않는 파일을 호출할 때 |
try-except 구문 외에도 try-except-else, try-except-else-finally와 같은 구문도 있습니다. assert는 특정 조건에 만족하지 않을 경우 예외를 발생시킵니다. raise는 강제로 에러를 발생시켜서 알려주는 역할로 사용됩니다.
2) File
파일은 기본적으로 text파일과 binary파일로 나눕니다. 컴퓨터는 text파일을 처리하기 위해 binary 파일로 변환을 시킵니다. 모든 text 파일도 실제로는 binary 파일인데 ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있습니다.
Binary 파일 | Text 파일 |
이진법 형식으로 저장 | 문자열 형식으로 저장 |
메모장으로 열면 내용 확인 불가 | 메모장으로 열면 내용 확인 가능 |
엑셀파일, 워드 파일 등 | 메모장에 저장된 파일, HTML 파일, py 파일 등 |
파이썬에서 파일로 접근하기 위해서 open 키워드를 사용합니다. 예시는 아래와 같습니다.
# read
f = open("파일명", "r") #접근모드는 r(읽기), w(쓰기), a(추가)
f.close()
with open("파일명","r") as f:
contents = f.read()
print(contents) # 파일 표시
# f.close() 가 없는 형태.
with open("파일명","r") as f:
contents_list = f.readlines() # 한줄씩 읽어서 리스트형태로 반환, 메모리가 적게 쓰고 싶으면, readline()
# write - 파일을 새로 생성
f = open("파일명", "w", encoding='utf8') #저장 표준에 대한 것 - encoding
for i in range(1, 11):
data = "%d번째 줄입니다.\n" % i
f.write(data)
f.close()
# append - 기존 파일에 덮어쓰기
with open("파일명", mode="a", encoding="utf8") as f:
for i in range(11, 21):
data = f'{i}번째 줄입니다.\n'
f.write(data)
파이썬에서 directory 다루는 방법에는 os 모듈을 활용하는 방법이 있습니다. 파일을 옮길 때는 shutil이라는 모듈을 활용합니다. 최근에는 pathlib 모듈을 사용하여 path를 객체로 다루기도 합니다. 해당 모듈들은 범위가 광대하기 때문에 구글을 통해서 찾아보는 것을 권장합니다. pickle은 객체를 영속화하는 built-in 객체입니다. 객체를 영속화한다는 것이 무엇일까요? 객체는 항상 인터프리터가 종료되면 메모리에서 사라지게 됩니다. 하지만, 가끔 프로그래밍을 하다 보면 해당 정보를 남겨서 사용하고 싶을 때가 있을 수도 있습니다. 그런 경우 pickle을 활용해서 저장하고 사용할 수 있게 됩니다.
import pickle
f = open('list.pickle', 'wb') # b : 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)
test_pickle # [1,2,3,4,5]
f.close()
3) Log
Logging은 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기는 것을 말합니다. 주로 담기는 정보는 유저의 접근, Exception, 특정 함수의 사용 등이 있습니다. 남기는 방법에는 Console 화면에 출력(분석 시 사용불가), 파일에 남기기, DB에 남기기 등이 있습니다.
파이썬에서 log 관리 모듈은 logging이 존재합니다.
level | 개요 | 예시 |
debug | 개발시 처리 기록을 남겨야하는 로그 정보를 남김 | 다음함수로 A를 호출함 변수 A를 B로 변경함 |
info | 처리가 진행되는 동안의 정보를 알림 | 서버 시작됨 서버 종료됨 사용자 A가 접속함 |
warning | 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않은 정보가 들어왔을 때 알림 | Str 입력을 받아야 하는데, Int가 입력됨 - str casting으로 처리 함수에 이차원 리스트 대신 일차원 리스트가 입력됨. - 이차원으로 변환 후 처리 |
error | 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작 가능 | 파일에 기록을 해야하는데 파일이 없음 - Exception 처리후 사용자에게 알림 외부서비스와 연결 불가 |
critical | 잘못된 처리로 데이터 손실이나 더이상 프로그램 동작 불가 | 잘못된 접근으로 해당 파일이 삭제됨 사용자에 의한 강제 종료 |
logging은 미리 설정이 필요합니다. 보통 두 가지 방법으로 설정하는데, configparser와 argparser가 있습니다. 먼저, configparser는 프로그램의 실행 설정을 파일에 저장합니다. argparser는 Console 창에서 프로그램 실행 시 Setting 정보를 저장합니다.
# configparser, argparser 추가 공부.
최성철 교수님 - Python data handling
1) CSV
CSV(Comma Separate Values)는 쉼표로 구분한 텍스트 파일입니다. 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식이라고 생각하면 쉽습니다. 비슷한 형태로는 탭(TSV), 빈칸(SSV) 등도 있습니다. Text파일 형태로 데이터 처리 시 문장 내에 들어가 있는 ", " 등에 대해 전처리 과정이 필요합니다.
CSV 객체 활용하는 방법에 대해서 알아봅시다. 파일에 접근할 때, open을 사용해도 좋지만, csv를 활용할 수도 있습니다.
import csv
reader = csv.reader(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
각각의 csv.reader의 파라미터에 대한 설명입니다. 하지만, csv 핸들링은 pandas로 더 많이 하게 됩니다.
Attribute | Default | Mean |
delimiter | , | 글자를 나누는 기준 |
lineterminator | \r\n | 줄 바꿈 기준 |
quotechar | " | 문자열을 둘러싸는 신호 문자 |
quoting | QUOTE_MINIMAL | 데이터 나누는 기준이 quotechar에 의해 둘러싸인 레벨 |
2) Web
우리가 항상 많은 시간을 사용하고 있는 것인 Web은 World Wide Web을 줄여서 웹이라고 부릅니다. 데이터 송수신을 위한 HTTP 프로토콜 사용하고, 데이터를 표시하기 위해 HTML 형식을 사용합니다. HTML(Hyper Text Markup Language)은 웹 상의 정보를 구조적으로 표현하기 위한 언어입니다. 제목, 단락, 링크 등 요소 표시를 위해서 Tag를 사용합니다. 모든 요소들은 꺾쇠괄호 안에 둘러 쌓여서 사용됩니다. <title> Hello, World </title>과 같이 사용합니다. 모든 HTML은 트리 모양의 포함관계를 가지고 있습니다. 일반적으로 웹 페이지의 HTML 소스파일은 컴퓨터가 다운로드한 다음에 웹 브라우저가 해석/표시해줍니다. 그런데 갑자기 왜 Web에 대해서 이야기할까요? 그 이유는 데이터들이 엄청 많이 존재하고 있는 곳이 Web이기 때문입니다. 규칙을 분석해서 데이터의 추출이 가능합니다. HTML은 str, 정규표현식, BeautifulSoup으로 분석할 수 있습니다.
정규표현식(Regular expression)은 복잡한 문자열 패턴을 정의하는 문자 표현 공식입니다. 특정한 규칙을 가진 문자열의 집합을 추출할 때 사용합니다. 자세한 내용은 필요할 때 찾아보는 것이 더 좋은 것 같습니다.
3) XML(eXtensible Markup Languages)
XML은 데이터의 구조와 의미를 설명하는 TAG를 사용하여 표시하는 언어입니다. HTML과 거의 비슷한 언어라고 보면 됩니다. TAG와 TAG사시에 값이 표시되고, 구조적인 정보를 표현할 수 있습니다. XML은 컴퓨터(이기종) 간에 정보를 주고받기 매우 유용한 저장 방식으로 쓰이고 있습니다. HTML과 같이 구조적 markup 언어이며, 정규표현식으로 Parsing이 가능하지만 더 쉬운 도구들이 개발되어 있습니다. 대표적인 beautifulsoup로 파싱 할 수 있습니다.
4) JSON(JavaScript Object Notation)
JSON은 웹 언어인 Java Script의 데이터 객체 표현 방식입니다. 간결성으로 기계와 인간이 모두 이해하기 편합니다. 데이터 용량이 적고, Code로의 전환이 쉽습니다. XML의 대체제로 많이 활용되고 있습니다. Dictionary 형태와 매우 유사합니다. json 모듈을 활용해서 쉽게 파싱 및 저장이 가능합니다. 페이스북이나 트위터, Github 등 거의 모든 사이트 등 거의 모든 사이트에서 활용하고 있습니다. 각 사이트마다 Developer API의 활용법을 찾아서 사용할 수 있습니다.
2. 피어 세션 정리
1) 복습
추상 클래스를 만들 수 있는 방법 import abc를 활용해서 가능합니다.
2) 과제 관련 내용
Morsecode랑 baseball 코드 리뷰
3) while문을 좀 더 효율적으로 나오는 방법 : stop이란 변수에 True, False 할당하고 while not stop으로 지정해주면 잘 작동합니다.
3. 과제 진행 상황
이번 주 과제 리뷰
1) git 활용법 익히기
-
과제 url로 연결 후 git clone url주소로 로컬에 연결
-
연결되면 vscode로 해당 코드를 수정한 뒤 저장
-
git을 실행 후 코드가 있는 폴더로 이동
-
git status로 변동사항 있는 파일 확인
-
git add *. py 또는 git add 제출 파일. py
-
git commit -m "Update my code"
-
git push origin main
2) basic_math
-
특별하게 어려운 부분은 없었습니다.
3) text_processing
-
이 부분도 특별하게 어렵진 않았지만, str을 연결해주는 과정에서 처음 변수 선언 시 str()이나 ''로 해줘야 에러가 발생하지 않습니다.
4) text_processing_2
-
맨 처음에 작성했을 때, 문제가 없을 거라고 생각했지만 다양한 예외들이 있어서 시간이 조금 걸렸던 문제였습니다.
-
capitalize() : 알파벳 첫 번째만 대문자로 반환해줍니다.
-
예외 처리하는 것이 생각보다 어려운 것 같습니다.
5) baseball
-
명세를 잘 읽어야 한다는 것을 깨닫게 되었습니다.
-
y/n를 판별하는 부분에서는 글씨를 대문자나 소문자로 바꾼 다음에 사용하는 것이 좋을 것 같습니다.
-
while문을 빠져나오는 부분에 대한 답안을 한번 확인하면 좋을 것 같습니다.
6) morsecode
-
이 문제는 baseball과 같은 과오를 겪지 않기 위해 먼저 손으로 흐름도를 그려봤습니다. 흐름도를 그리고 작성을 해보니, main()을 만들기 수월했습니다.
-
띄어쓰기에 대한 이슈가 가장 많았고, 이 부분을 해결하기 위해서 pycharm으로 옮겨서 부분 테스트를 많이 해봤습니다.
-
특수기호 banned 하기 위해서 str에 묶었는데, 코드에 작용하는 기호는 \로 처리를 해줬습니다.
-
공백만 있는 경우, 해당 판별하는 위치에서 걸러낼 수 있도록 수정했습니다.
-
글씨와 글씨 사이에 공백이 많이 있는 경우 걸러주기 위해서 join() 함수 사용했습니다.
-
morsecode인지 확인하는 부분에서 특수문자로만 걸러주면 '......'과 같은 특이 케이스가 통과해버리는 문제가 생겼습니다. 이를 dictionary value와 비교하는 것으로 변경했습니다.
-
마지막으로 모스부호 2칸에 대한 띄어쓰기 문제가 있어서 수정해서 숙제 완료할 수 있었습니다.
4. 이번주 피드백
이번 주 열심히 했지만 아직도 세상은 넓고 공부할 것은 많다. 공부하자.
이번 주를 피드백하면, 월요일을 시작해서 컴퓨터 앞에서 수업 듣고 공부하는 시간 외에는 특별하게 한 것이 없었습니다. 강의 내용 중에 parser, generator, decorator와 같은 개념들에 대해서는 좀 더 공부할 필요가 있을 것 같습니다. 부스트 캠프를 진행하면서 힘이 든다라는 생각보다는 해결해보겠다는 생각이 가장 큰 것 같습니다. 다행히 이번 주의 내용은 따라갈 수 있었지만 앞으로의 내용들도 계속 공부하면서 잘 따라갈 수 있었으면 좋겠습니다. 특히, 코딩 측면에서 부족한 부분이 많아서 다른 피어들의 도움을 많이 받고 있습니다. 같이 공부하고 있는 피어분들에게 감사합니다. 오늘 진행된 최성철 교수님의 마스터 클래스는 10분 같은 1시간이었던 것 같습니다. 그만큼 아쉽고 좋은 내용들을 현실감 있게 느낄 수 있었던 것 같습니다. 앞으로 다양한 클래스와 콘텐츠에 기대가 되며, 잘 따라갈 수 있도록 공부해야겠습니다.