목차





File / Exception / Log Handling

Exception

  • 예상 가능한 예외
    • 발생 여부를 사전에 인지가능
    • 사용자의 잘못된 입력, 파일 호출 시 파일 없음 등
    • 개발자가 명시적으로 처리해야 함

    → if 문으로 처리 가능

  • 예상 불가능한 예외
    • 인터프리터 과정에서 발생하는 예외, 개발자 실수
    • 리스트의 범위를 넘어가는 호출, 정수 0으로 나눔
    • 수행 불가시 인터프리터가 자동 호출

    → Exception Handling 으로 처리


예외 처리 (Exception Handling)

  • 예외에 적절한 처리를 함
  • try ~except 문법

      try:
      	예외 발생 가능 코드
      except <Exception Type>:
      	예외 발생시 대응 코드
        
    
      for i in range(10):
      	try:
      		print(10 / i)
      	except ZeroDivisionError: # ZeroDivisionError 는 빌트인 에러
      		print("Not divided by 0")
    
    • 익셉션 발생해도 프로그램 끝나지 않음, 안정적으로 프로그램 수행 가능
    • 맨 밑에 except Exception 하는건 어떤 익셉션인지 알기 어렵기 때문에 좋지 않음
  • finally 구문 : 예외 상관없이 항상 실행
  • raise 구문 : 필요에 따라 강제로 익셉션을 발생
  • assert 구문 : 특정 조건을 만족하지 않을 경우 예외 발생


File Handling

  • 텍스트 파일 (사람이 이해하는 문자열 형태, 메모장으로 볼 수 있음) 과 바이너리 파일 (컴퓨터가 이해하는 이진 코드 형태/ 엑셀 파일, 워드 파일 등등 메모장으로 못봄) 로 나뉨
    • 텍스트 파일도 실제는 바이너리 파일, 아스키 코드나 유니코드로 변환시킨 것
  • File Read

      # read() txt 파일 안에 있는 내용을 문자열로 반환
      f = open("book.txt", "r") # 상대 경로
      contents = f.read()
      print(contents)
      f.close()
    
      # with 구문으로 읽기
      with open("book.txt", "r") as my_file:
      	contents = my_file.read()
      	print(type(contents), contents)
    
    • read() : 전체를 하나의 문자열로 담음
    • readline() : 한 줄을 문자열로 담음
    • readlines() : 문자열 한 줄씩 리스트에 담아줌
  • File Write

      # mode = "w", encoding = "utf8"
      f = open("book.txt", "w", encoding="utf8) 
      for i in range(1, 11):
      	data = "%d번째 줄입니다.\n" % i
      	f.write(data)
      f.close()
    
      # with 구문으로 읽기, mode = "a"
      with open("book.txt", "a", encoding="utf8") as my_file:
      	for i in range(1, 11):
      	data = "%d번째 줄입니다.\n" % i
      	f.write(data)
    
    • 인코딩 : 컴퓨터에 문자 저장하는 표준
    • w 모드 : 해당 문서를 새로 작성
    • a 모드 : 해당 문서가 없으면 만들어서 작성하고 있으면 뒤에 연결하여 작성


OS 모듈

  • 폴더 만들기

      import os
    
      # 폴더 생성
      os.mkdir("book_folder")
    
      # 폴더 없다면 생성
      try:
      	os.mkdir("abc")
      	except FileExistError as e:
      		print("Already created")
    
    


shutil 모듈

  • shutil.copy : 파일 복사 함수

      import shutil
    
      source = "book.txt"
      dest = os.path.join("abc", "book2.txt") # 옮길 경로 지정, abc/book2.txt
      shutil.copy(source, dest) # source 의 내용을 dest 로 옮김
    


pathlib 모듈

  • 최근에 많이 사용, path 를 객체로 다룸

      import pathlib
    
      cwd = pathlib.Path.cwd() # 현재 path 위치 알려줌
      cwd.parent # 하나 윗경로 알려줌
    


등등 여러 모듈이 있으니 필요할 때 찾아서 쓰면 된다.


Pickle

  • 파이썬의 객체를 영속화(persistence) 하는 빌트인 객체
  • 데이터, object 등 실행중 정보를 저장 → 불러와서 사용
  • 저장해야하는 정보, 계산 결과(모델) 등 활용이 많음
  • 파이썬에 특화된 바이너리 파일!
import pickle

# 데이터를 피클로 저장해둠
f = open("list.pickle", "wb")
test = [1, 2, 3, 4]
pickle.dump(test, f)
f.close()

# test 삭제
del test

# 이제 test 데이터가 없지만, 저장해둔 피클을 불러와서 사용할 수 있음
f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
print(test_pickle)
f.close()
  • 클래스의 인스턴스도 저장 가능


Logging Handling

  • 게임에서 핵쓰는 유저 어떻게 잡을까?
    • 기록을 남겨야 잡을 수 있음! → 로그
  • 로그 남기기 - Logging
    • 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기기
    • 유저의 접근, 프로그램의 익셉션, 특정 함수의 사용
    • 콘솔에 출력하거나, 파일에 남기거나, db 등에 남길 수도 있음
    • 기록된 로그를 분석하여 의미있는 결과를 도출할 수 있음
    • 실행시점에 남겨야하는 기록과 개발시점에 남겨야하는 기록으로 나뉨
  • print v logging
    • 둘다 기록 남기는건 가능하지만, print 는 콘솔 창에만 남으므로 분석시 사용 불가
    • 로깅은 레벨별(개발, 운영), 모듈별 등 체계적으로 기록을 남길 수 있음
  • logging level
    • 프로그램 진행 상황에 따라 다른 레벨의 로그를 출력
    • DEBUG > INFO > WARNING > ERROR > CRITICAL(제일 심각) 단계가 있음
    • 기본 로깅 레벨은 워닝 ~ 크리티컬, 이 레벨에 있는 로깅만 사용자에게 나옴 → 로깅 레벨 변경 가능
  • 파일에 기록

      import logging
    
      if __name__ = "__main__":
      	logger = logging.getLogger("main")
      	logging.basicConfig(level=logging.DEBUG)
      	logger.setLevel(logging.INFO)
    
      	steam_handler = logging.FileHandler(
      		"my.log", mode="w", encodin="utf8")
      	logger.addHandler(steam_handler)
    
      	logger.debug("틀림")
      	logger.error("에러")
    


다양한 설정을 돕는 툴

  1. configparser
    • 프로그램의 실행 설정을 파일에 저장함
    • 섹션, 키, 밸류 값의 형태로 설정된 설정 파일 사용
    • 설정파일을 딕트 타입으로 호출 후 사용
    • example.cfg 라는 컨피그 파일이 있으면 이것을 불러와서 설정
  2. argparser (= Command-Line Option)
    • 콘솔창에서 프로그램 실행시 세팅 정보를 저장
    • ex) ls —help 에서 — 붙여서 사용
    • add_argument 로 추가 가능
     import argparse
    
     parser = argparse.ArgumentParser(
     	description="Sum two integers.")
    
     parser.add_argument(
     	'-a', "--a_value",
     	dest="a", help="A integers", type=int,
     	required=True)
    




Python Data Handling


CSV (Comma Separate Value)

  • 필드를 쉼표로 구분한 텍스트 파일
  • 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식
  • 콤마 말고 탭(TSV), 빈칸(SSV) 등으로 구분하기도 함 → 모두 CSV 라고 부름
  • 파일 읽고 콤마로 split 하여 사용 → 더 간단히 csv 파일 처리하기 위해 csv 객체 사용하자
    • delimeter : 글자를 나누는 기준
    • lineterminator : 줄 바꿈 기준
    • quotechar : 문자열을 둘러싸는 신호 문자
    • quoting : 데이터 나누는 기준이 quotechar 에 의해 둘러싸인 레벨
      import csv
    
      reader = csv.reader(f, delimeter=', ',
          quotechar='"', quoting=csv.QUOTE_ALL)
    
    
  • 첫 줄은 데이터 헤더, 나머지는 일반 데이터
  • 한글 파일 읽을 때 encoding=’cp949’


인터넷 (web)

  • WWW (World Wide Web), 줄여서 웹
  • 우리가 늘 쓰는 인터넷 공간의 정식 명칭
  • 데이터 송수신을 위한 HTTP 프로토콜 사용
  • 데이터 표시를 위해 HTML 형식 사용
  • 웹은 어떻게 동작하는가?
    1. 요청 : 웹주소, Form, 헤더 등
    2. 처리 : 데이터베이스 처리 등 요청 대응
    3. 응답 : HTML, XML 등으로 결과 반환
    4. 렌더링 : HTML, XML 표시
  • 왜 웹을 알아야 하는가?
    • 많은 데이터들이 웹을 통해 공유됨
    • HTML 도 일종의 프로그램, 페이지 생성 규칙이 있음 → 규칙을 분석하여 데이터 추출 가능
    • 추출된 데이터로 다양한 분석 가능


HTML (Hyper Text Markup Language)

  • 웹 상의 정보를 구조적으로 표현하기 위한 언어
  • 제목, 단락, 링크 등 요소 표시를 위해 Tag 사용


정규식 (regular expression)

  • 정규 표현식, regexp 또는 regex 등으로 불림
  • 복잡한 문자열 패턴을 정의하는 문자 표현 공식
  • 특정한 규칙을 가진 문자열의 집합을 추출
  • 주민등록 번호, 전화번호, 도서 ISBN 등 형식이 있는 문자열 파싱
  • 기본적인거만 공부하고 필요한거 찾아서 사용
  • 기본 문법 #1
    • 문자 클래스 [ ] : [ 와 ] 사이의 문자들과 매치라는 의미
      • [abc] : 해당 글자가 a, b, c 중 하나가 있다.
    • - 를 사용하여 범위를 지정할 수 있음
      • [a-zA-Z] : 알파벳 전체
    • 원래 의미 말고 정규식용 의미 지닌 문자들
      • . ^ $ * + ? { } [ ] \ | ( )
    • . : 줄바꿈 문자 \n 제외한 모든 문자와 매치
    • * : 앞에 있는 글자를 반복해서 나올 수 있음
    • + : 앞에 있는 글자를 최소 1회 이상 반복
  • ex) (http)(.+)(zip) : 문서에서 http 로 시작하고 .zip 으로 끝나는 문장 추출


정규식 in Python

  • re 모듈을 import 하여 사용
  • 함수 : search - 한 개만 찾기, findall - 전체 찾기
  • 추출된 패턴은 tuple 로 반환
  • ex) ([A-Za-z0-9]+***) : 문서에서 ID 추출하기 (dldydld***)
  • 파이썬 코드
import re
import urllib.request

url = "https://bit.ly/3rxQFS4"
html = urllib.request.urlopen(url)
html_contents = str(html.read())
id_results = re.findall(r"([A-Za-z0-9]+\*\*\*)", html_contents)

for result in id_results:
	print(result)


XML

  • 데이터의 구조와 의미를 설명하는 TAG(MarkUp) 을 사용하여 표시하는 언어
  • TAG 와 TAG 사이에 값이 표시되고, 구조적인 정보를 표현할 수 있음
  • HTML 과 문법이 비슷, 대표적인 데이터 저장 방식
  • XML 은 컴퓨터 간에 정보를 주고받기 매우 유용한 저장방식으로 쓰이고 있음
  • 정보의 구조에 대하 정보인 스키마와 DTD 등으로 정보에 대한 정보(메타정보)가 표현되며, 용도에 따라 다양한 형태로 변경가능


XML Parsing in Python

  • XML 도 HTML 과 같이 구조적 markup 언어
  • 정규표현식으로 Parsing 이 가능하지만, 더 쉬운 beautifulsoup 으로 파싱
  • lxml 파서도 사용


JSON (= Javascript Object Notaion)

  • 원래 웹 언어인 js 의 데이터 객체 표현 방식
  • 간결성으로 기계/인간이 모두 이해하기 편함
  • 데이터 용량이 적고, 코드로 전환이 쉬움
  • xml 대체로 많이 사용 → xml 보다 간결하고 용량도 적음
  • dict 처럼 {키:밸류} 쌍으로 표시
  • import json 해서 사용 → load 하면 자동으로 dict 로 받아들임
  • read 는 load, write 는 dump




마스터 세션 - 최성철 마스터님


QnA

1. AI 로 할 수 있는 일이 어떤게 있을까요?

  • NLP
  • 데이터마이닝
  • 데이터 클러스터링 (비지도학습)
  • 영상처리 등

2. 만약 AI 를 더 공부하고 싶어서 대학원을 간다면 어떤 것을 더 준비해야 할까요?

  • 수학 : 선형대수, 미적분, 통계학, 수리통계, 해석학
  • 프로그래밍 능력 : 문제해결 능력, db, 엑셀 등
  • 석사 → 논문을 읽고 구현하는 능력이 있어야 함

3. 수학을 배운지 오래된 학생인데 AI 를 제대로 배우기 위해서는 선형대수, 미적분, 기초통계학에 대한 지식이 있어야 된다고 들었습니다. 지금부터 공부하려고 하는데 세 과목을 어느 수준으로 공부해야 앞으로 과정을 따라가기가 수월할까요?

  • 논문 이해하는데 문제 없을 정도
  • 책에 문제가 있다면 반은 풀 정도

4. 강화학습을 활용한 자율주행이나 게임인공지능 분야에 관심이 많습니다.

1) 강화학습 (RL) 이 쓰이는 분야는 어디가 있나요?

  • 게임 (싸펑은 RL 로 학습해서 성능이 떨어지는게 아닌가 생각하심)
  • offline RL

2) AI 분야의 데이터 엔지니어를 희망하면 수학은 어느정도로 해야 할까요?

  • 3 에서 언급

5. AI 에서 특별히 많이 쓰이는 pythonic 코드가 있을까요? Str 함수 외에도 궁금합니다.

  • slang 처럼 일상적으로 쓰임
  • list comprehension, zip, enumerate 등 수업에서 배운 것들

6. 데이터 사이언티스트와 머신러닝 엔지니어는 어떻게 다른지 알고 싶습니다.

  • 머신러닝 엔지니어
    • 머신러닝, 딥러닝에 대해 잘 이해하고 논문을 읽고 기존 모델을 전체 시스템과 잘 연동한 파이프라인을 만드는가
    • 새로운 모델을 만드는 일 x, 활용하고 서비스 하는 일
    • 서비스까지에 있어 데이터 전처리 하고 리소스를 위해 경량화하는 등
  • 데이터 사이언티스트
    • 거의 모든 분야 다루는데 좁게 말하면 데이터를 분석해서 의사결정에 도움을 준다거나 하는 일 (스타트업은 잘 안함)
    • 인터넷에서 Full-stack DL 이라는 강의 듣기 권장

7. 교수님이 현재 부스트캠퍼라면 캠프 과정을 따라가는 것 이외에 무엇을 하실지 궁금합니다.

  • 주식 → 세상에 관심을 갖기 위해

8. 읽기 좋은 코드는 꼭 간결해야 하나요?

  • 간결하다고 꼭 좋은 코드는 아님
  • 좋은 코드 = 좋은 보고서
  • 좋은 변수명을 짓는 것부터 시작

9. AI 서비스를 만들기 위해 필요한 엔지니어링 기술을 배우고 싶습니다. 빅데이터 처리에 스파크를 쓰는 것처럼, 배우면 좋을 기술 스택이 있을까요?

  • 스파크도 쓸 줄 알아야 하고, 하둡, 에어 플로우 등 다 관심깊게 보는게 좋다.

10. 미래에 AutoML 이 발전한다면 모델링도 AutoML 이 해결해줄거라 예상하나요?

  • 딱히 그렇게 안 봄, 전체 파이프라인을 연결해주는 능력 + 서비스 만들어내는 능력은 사람의 중요한 역량
  • 필요한 능력
    • 전체 파이프라인을 구성하고 연결하는 능력
    • 서비스를 만들어내는 능력
    • 데이터의 처음부터 끝까지를 자동화 시키는 능력
    • 데이터를 어떻게 모을 것인지

11. AI를 공부하고 관련 직종에 취직하기 위해서는 아무래도 대학원 석사과정을 밟는 것이 거의 필수적인가요??

  • 필수는 아닌데 확률을 매우 높이기 때문에 추천함
  • 박사는 별로 권장안함, 석사는 추천!
  • AI 엔지니어 할거면 석사 정도는 돼야한다 생각
  • 백엔드(웹개발) 역량은 기본 소양으로 쓰임
  • 모델을 개발할 때는 파이썬 쓰지만, 실제 서비스 할 때는 C 나 자바 계열 많이 씀

12. 파이프라인 짜는 능력은 어떻게 키울 수 있나요?

  • 프로젝트를 통해서만 키울 수 있다.




피어 세션


일주일 회고

  • 후미 : 생각보다 1주차가 널널하지 않고 빡셌다.
  • 펭귄 : 팀프로젝트에 대한 트라우마가 있어서 긴장했는데 좋은 조원들 만나서 좋다. 자바나 씨쁠쁠보다 파이썬 되게 좋아하는데 이해 못하고 잘 몰랐던 부분 조금 더 깊이 공부할 수 있어서 좋았다.
  • 원딜 : 예전부터 ML 하면서 파이썬 써왔는데 모르는 부분 얻을 수 있어서 좋았다. 전에 강의들을때보다 더 자세하게 공부할 수 있어서 좋았다.
  • 서폿 : 팀원에 대한 걱정이 많았는데 좋아서 다행이고 감사하다. 코드스쿼드랑 부캠 동시에 합격해서 선택해야 했는데 여러가지 + 조원들 보고 부캠 선택했다. 강의적으로도 파이썬에 많은 도움이 되고 있다. 파이썬 코딩 도장 책 추천한다.
  • MJ : 조원들 때문에 피어세션이 기다려지고 힘이 난다. 펭귄님 리딩 덕에 코드 리뷰 했던 것이 많은 도움이 됐다.
  • 샐리 : 펭귄님이 첫 틀을 잘 잡아줘서 감사하고 피어세션 이 수업보다 재밌다. 파이썬 안다고 생각했는데 심화된 내용 들으면서 정리할 수 있어서 좋았다. 앞으로가 기대된다.
  • 히스 : 모르는 건 대충 짚고 넘어가는 경우가 많았는데 모르는 것을 계속 찾아보며 공부하게 되었다. 앞으로도 잘 헤쳐나가겠다!


피어 세션 피드백

  • 히스 : 오늘 수업 들은거 모르는거나 질문 그날 피어세션에 질문하고 답 못찾으면 그날 자습하면서 답 달고 다음날 체크하면 좋겠다. → 다음주부터 적용
  • 서폿 : 알고리즘 문제 하루에 1 개씩 풀면 좋겠다.
  • 일정이 조금 널널하다면, 주제를 정해서 같이 공부해도 좋을 것 같다.
  • 자기가 아는 내용에 관해 5분 정도 짧게 세미나 하면 좋을거 같다. (일주일 한 번 정도)
    • 서폿 : 세미나를 더 키우자 (슬랙에 올려서 일주일 15분 3명 정도로, 비어세션)
    • 후미 : 판이 커지면 어수선해지고 그럴거 같다.

    세부 사항

    • 1 인 최대 10분 발표 + QnA 시간 최대 10분
    • 형식 : 자유롭게
    • 주제 : 자유롭게
    • 시간 : 수요일 피어세션 시작부터

코드 리뷰 - 과제 2

  • 원딜님 코드 : any 를 써서 원소 걸러내는 방법 익히는 방법 인상적
  • 서폿님 코드 : 딕트 밸류 반대로 만드는법

      # 내 방법
      r_map = dict(map(reversed, o_dict.items()))
    
      # 서폿님 방법
      r_map = dict(zip(o_dict.values(), o_dict.keys()))
    




Today I Felt


환기

오늘 피어 세션에서 펭귄님이 각자 자유롭게 세미나 하는 시간을 가져보자는 의견을 내주셨다. 우아한 테크 톡 을 보면서 저런거 해보면 재밌겠다 싶었기에 펭귄님의 제안이 신선했다. 멋지다 생각만 하고 실천까지 생각도 못했었는데 직접 할 수 있다니 :)

혼자 였으면 고일 뻔한 물이 다른 사람들로 인해 환기되고 있다. 부캠이 끝나면 동료들을 통해 나는 어떻게 성장했을지 설레고 궁금하다.

완전한 이해는 어려워

피어 세션을 하면서 MJ님이 리스트가 아이터레이터인데 왜 또 iter 라는 내장함수가 있냐는 질문을 했다. 다행히 내가 공부했던 부분이기에 (원래였다면 안했겠지? 대견스) 최대한 아는 선에서 바른 답 리스트는 iterable 이고 iterable 과 iterator 의 차이에 대해 을 알려드리려 노력했다. 이렇듯 모르는 부분에 대해 끝까지 공부하는 습관이 도움이 되고 있다.
그러나 mock 에 대한 개념이 어려워서 며칠째 어떻게 정리해서 블로깅할지 머리가 아프다. 솔직히 안올리고 싶은 마음이 굴뚝스,, 그치만 확실한 이해가 도움이 됐음을 상기하며 주말 내에 꼭 이해해서 포기하지 않고 글을 올려야겠다.