부스트캠프에서 새롭게 알게 된 사실들

4-2강 Module and Project

pycache 폴더

기계어로 번역된 컴파일된 파일들을 모아놓는 곳

모듈을 불러오는 여러가지 방법

import 모듈

from 모듈 import 함수 or 클래스

from 패키지 import 모듈

if __name__ == ‘__main__’:

파일 안에 다음과 같이 작성을 하면, if  안에 속하는 코드는 오직  파일을 직접 실행시켰을 때만 동작한다

print("hi thank you for importing me")

if __name__ == '__main__':
  print("to be honest i don't hahahaha")

__init__.py와 __main__.py

__init__.py

  • 현대 폴더가 패키지임을 알리는 초기화 스크립트
  • 3.3 버전 이후에는 없어도 무방
  • import와 __all__ keyword 사용

# __init__.py

__all__ = ["하위 폴더1(모듈)", "하위 폴더2(모듈)", ..]

from . import 하위 폴더1
from . import 하위 폴더2

__main__.py

  • 패키지명으로 실행되는 파일
# __main__.py

from 서브폴더 import 모듈명

# 이 부분이 필수는 아니지만 다른 곳에서 이 패키지를 임포트했을 때 실행되지 않았으면 하는 부분은 여기에 넣으면 된다
if __name__ == '__main__':
  print(모듈명.함수(100))

5-1강 File / Exception / Log Handling

Exception Handling

if - else vs try - except else - finally

# 파이썬에서는 if - else를 통한 예외 처리보다 try-except를 이용한 예외처리를 권장한다
# except문이 실행되도 코드가 끝나는 건 아니다 for문 안에 있을 경우 for문을 마저 계속 돌린다
try:
  ...

except 에러:
  ...

# 어떤 에러인지 알고 싶을 때
try:
  ...

except 에러 as e:
  print(e)
# 모든 에러를 잡아준다 ( IndexEroor, ValueError, ...)
try:
  ...

except Exception as e:
  print(e)
try:
  ...
except:
  ...
# try, except에서 다 걸리지 않으면 else문 실행
else:
  ...
# 어떤 경우데도 finally 실행된다
# [try or except or else] + finally
try:
  ...
except:
  ...
else:
  ...
finally:
  ...

코드 중단 시키기: raise vs assert

프로그램이 끝날 때까지 시간이 오래 걸리거나, 리소스가 많이 필요한 경우 에러가 발생했을 때는 프로그램이 종료되도록 하는 것이 좋다.

while True:
  value = input("숫자를 입력하세요:")
  for digit in value:
    if digit not in "0123456789":
      raise ValueError("숫자값을 입력하지 않았습니다")
  
  print("정수값", int(value))
  break
  
def get_binary_number(decimal_number):
  assert isinstance(decimal_number, int)
  return bin(decimal_number)

print(get_binary_number(10.0))
--------------------------------------
AssertionError

File

텍스트 파일

  • 인간도 이해할 수 있는 문자열 형식으로 저장된 파일
  • 메모장으로 열면 내용 확인 가능
  • 메모장에 저장된 파일, HTML파일, 파이썬 코드 파일 등

Binary 파일

  • 컴퓨터만 이해할 수 있는 이진형식으로 저장된 파일
  • 일반적으로 메모장으로 열면 내용이 깨져 보임
  • (이진 파일도 이진 파일을 지원하는 프로그램으로 열어야 이진법으로 보인다)
  • 엑셀파일, 워드 파일 등

파일 Read & Write

파일 Read
f = open("파일 이름", "모드")
f.close()
# 파일 읽어오기
f = open("i_have_a_dream.txt", "r")
contents = f.read()
print(contents)
f.close
# with 구문 이용하기

with open("i_have_a_dream.txt", "r") as f:
  contents = f.read()
  print(contents)
# 파일을 한 줄씩 리스트에 저장해서 리스트 자료형으로 반환

with open("i_have_a_dream.txt", "r") as f:
  content_list = f.readlines()
  print(content_list)
# 실행마다 한 줄씩 읽어오기

with open("i_have_a_dream.txt", "r") as f:
  i = 0
  while True:
    line = my_file.readline()
    if not line:
      break
    print (str(i) + " === " + line.replace("\n", ""))
    i = i + 1
파일 Write
# w모드는 새로 작성 a모드는 추가하기
with open("count_log.txt", "w", encoding="utf8") as f:

for i in range(1, 11):
  data = "%d번 째 줄입니다.\n" % i
  f.write(data)

모듈을 이용한 파일과 디렉토리 다루기

os모듈
try:
  os.mkdir("log")
except FileExistsError as e:
  print("Already created")

os.path.exists("log")
----------------------------
True
pickle 모듈
  • pickle은 파이썬에 특화된 바이너리 파일
  • 파이썬 객체는 보통 메모리에 있다가 프로세스 종료되면 메모리에서 사라진다
  • pickle을 쓰면 파이썬 객체를 디스크에 파일로 저장할 수 있다
  • 한마디로 pickle은 파이썬의 객체를 영속화(persistence)하는 built-in 객체이다
import pickle

f = open("list.pickle", "rb")
test_pickle = pickle.load(f)
print(test_pickle)
f.close()
import pickle

f = open("list.pickle", "wb")
test = [1, 2, 3, 4, 5]
pickle.dump(test, f)
f.close

Logging Handling

로그 남기기

  • 유저의 접근, 프로그램의 Exception, 특정 함수의 사용에 관해 로그 남길 수 있다
  • Console 화면에 출력할 수도 있고, 파일이나 데이터베이스에 저장할 수도 있다.
  • 출력만 하는 것은 확인할 수는 있지만 분석에 이용할 수는 없다.
logging 모듈

[포스트 참조]

프로그램 실행 설정하기

configparser

  • Section, key, value의 형태로 파일 작성
  • 설정파일을 딕셔너리 타입으로 호출 후 사용
# config file
# example.cfg

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30

[SectionTwo]
FavoriteColor = Green
# configparser file

import configparser
config = configparser.ConfigParser()

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

for key in config['SectionOne']:
  value = config['SectionOne'][key]
  print(f"{key}: {value}")

config['SectionOne']["status"]

argparser

  • 콘솔창에서 프로그램 실행시 값 설정
# arg_sum.py

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('-a', '--a_value', type=int)
parser.add_argument('-b', '--b_value', type=int)

args = parser.parse_args()

print(args)
print(args.a)
print(args.b)
print(args.a + args.b)

python arg_sum.py -a 10 -b 10
-----------------------------------
Namespace(a=10, b=10)
10
10
20

다음과 같이 파일을 만들면 파이썬 파일 실행 시 하이퍼 파라미터 값들을 설정할 수 있다

5-2강 Python data handling

CSV

  • 엑셀 파일 -> .xlsx 파일 형태, 엑셀 프로그램에서 읽을 수 있음
  • 텍스트 파일 -> .csv 파일 형태, .txt 파일 형태, 엑셀, 메모장, 리눅스 쉘 등에서 읽을 수 있음

  • 텍스트 파일 처리시 문장내에 들어 있는 “,” 등에 대한 전처리 과정이 필요해 보통 open()이 아닌 csv객체를 생성하는 것이 낫다.
  • 가장 압도적으로 많이 사용하는 방법은 판다스를 통해 데이터를 불러오는 것이다(pd.read_csv())

파일 읽기

import csv

# 보통 윈도우에서 저장 관리되는 파일들은 cp949로 인코딩되어 저장 관리된다.
# 근데 vscode에서는 파일들을 utf-8로 인코딩하기 때문에 cp949로 인코딩해야 한다
with open("korea_foot_traffic_data.csv", "r", encoding="cp949") as p_file:
  csv_data = csv.reader(p_file)
  for row in csv_data:
    ...

파일 쓰기

import csv

seoung_name_data = []
header = []
rownum = 0

with open("seoung_nam_foot_traffic_data.csv", "w", encoding="utf8") as s_p_file:
  writer = csv.writer(s_p_file, delimiter = '\t', quotechar="'", quoting=csv.QUOTE_ALL)

  writer.writerow(header)
  for row in seoung_nam_data:
    writer.writerow(row)
    ...

Web

  • 인터넷 망을 World Wide Web(WWW), Web이라 부른다
  • 데이터 송수신을 위한 HTTP 프로토콜 사용
  • 데이터의 표시 방법을 통일하기 위해 HTML 형식 사용

HTML

  • 웹 상의 정보를 구조적으로 표기하기 위한 언어
  • 제목, 단락, 링크 등 요소들을 Tag로 구분
  • 모든 요소들은 꺽쇠 괄호로 표시된 Tag로 둘러 쌓여 있음
  • 웹은 거의 모든 정보가 담겨 있는 공간이므로 이 공간에 HTML 형식으로 저장된 파일을 잘 다룰 수 있어야 의미 있는 데이터를 추출할 수 있다

Data parsing

  • 정규표현식으로 Parsing이 가능함
  • 그러다 좀 더 손쉬운 도구들이 많이 개발되었음
  • 대표적으로 lxml, beautifulsoup이 있음

BeautifulSoup

  • HTML, XML과 같은 Markup언어를 Scraping을 위한 대표적인 도구
  • lxml과 html5lib와 같은 Parser를 wrapping한 도구
  • 속도는 상대적으로 느리지만 간편히 사용할 수 있음
from bs4 import BeautifulSoup

# 객체 생성
soup = BeautifulSoup(books_xml, "lxml")

# author라는 태그가 들어간 데이터 모두 찾아주는 find_all() 메소드
for book_info in soup.find_all("author"):
  print(book_info)
  print(book_info.get_text())
------------------------------------------------
<author>Carson</author>
Carson

<author>Sungchul</author>
Sungchoul

JSON(JavaScript Object Notation)

  • 웹 언어인 Java Script의 데이터 객체 표현 방식
  • 간결성으로 기계/인간이 모두 이해하기 편함
  • 데이터 용량이 적음
  • XML의 대체제로 많이 활용
  • 파이썬에서는 json모듈을 사용해 손쉽게 데이터 파싱 및 저장 가능

파일 읽기 json.loads()

# json_example.json

{"employees": [
  {"firstName": "John", "lastNmae": "Doe"},
  {"firstName": "Anna", "lastNmae": "Smith"},
  {"firstName": "Peter", "lastNmae": "Mike"},
]}
import json

with open("json_example.json", "r", encoding="utf8") as f:
  contents = f.read()
  json_data = json.loads(contents)
  print(json_data["employees"])
------------------------------------------------------
[
  {"firstName": "John", "lastNmae": "Doe"},
  {"firstName": "Anna", "lastNmae": "Smith"},
  {"firstName": "Peter", "lastNmae": "Mike"},
]

파일 쓰기: json.dump()

import json

dict_data = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

with open("data.json", "w") as f:
  json.dump(dict_data, f)

Tags:

Categories:

Updated: