Exception
예외 처리
try ~ except 문법으로 예외처리를 할 수 있다.
1
2
3
4
5
6
7
8
try:
예외 발생 가능 코드
except <Exception Type1>:
Type1 예외 발생시 실행할 코드
except <Exception Type2>:
Type2 예외 발생시 실행할 코드
except Exception:
이외의 예외의 처리 #이렇게 예외 전체를 잡아서 하는 처리는 권장하지 않음
Exception Type에 맞는 에러 발생시 예외 코드 실행시키고 예외가 발생했지만 Exception Type에 맞지 않으면 예외처리가 안된다. Exception type은 파이썬에서 미리 정해놓은 다양한 type이 존재하며 사용자가 직접 만들수도있다.
1
2
3
4
except ZeroDivisionError:
print("Not divided by 0")
except Exception as e:
print(e) # 무슨 예외인지 출력
- Exception type
- indexError : List의 index범위를 넘어갈 때
- NameError : 존재하지 않는 변수 호출
- ZeroDivisionError : 0으로 나눌 때
- ValueError : 변환할 수 없는 문자/숫자를 변환할 때
- FileNotFounError : 존재하지 않는 파일 호출할 때
else와 finally
1 2 3 4 5 6
try: 예외 발생 가능 코드 except <Exception Type>: 예외 발생시 동작하는 코드 else: 예외가 발생하지 않을 때 동작하는 코드
1 2 3 4 5 6
try: 예외 발생 가능 코드 except <Exception Type>: 예외 발생시 동작하는 코드 finally: 언제나 작동하는 코드
raise
강제로 Exception발생
raise <Excpetion Type> (msg)
1 2 3 4 5 6 7 8 9
a = 3 try: if a == 3: raise ValueError("잘못입력") except ValueError as e: print(e) ## output # 잘못입력
assert
특정 조건에 만족하지 않을 경우 예외 발생
assert 예외조건, (msg))
예외조건이 False라면 예외 발생1 2 3 4
a = 3 assert a == 1,"잘못된 값" # AssertionError: 잘못된 값
파일 입출력
open, close
파일을 열거나 닫기 위해 사용하는 키워드이다.
f = open("파일경로", "접근모드")
형식으로 사용한다.
접근 모드의 경우 r(읽기). w(쓰기), a(추가) 가 있다.
1
2
3
with open("test.txt", "r") as f:
content = f.read()
print(content)
파일의 경우 사용이 끝나면 close를 해주어야하는데 위의 코드처럼 with구문과 함께 사용하게되면 with이후 indent된 코드를 다 실행하면 자동으로 close된다.
read
read()
파일 전체의 내용을 str타입으로 반환
readlines()
파일 전체의 내용을 개행 문자를 기준으로 나누어 list로 반환
개행문자를 지우지않음
readline()
파일을 한줄씩 읽어오기, 파일이 너무 커서 한번에 메모리에 올리기 불가능할 때 사용
1 2 3 4 5 6
with open("test.txt", "r") as f: while True: line = f.readline() if not line: break print(line.replace("\n",""))
write
f = open("test.txt", "w", encoding="utf8")
출력(mode = “w” or mode = “a”)을 위해 파일을 오픈하는 경우 encoding을 잘 작성해 주어야한다.
1
2
3
4
5
f = open("test.txt", "w", encoding="utf8")
for i in range(10):
data = f"{i}번째\n"
f.write(data)
f.close()
OS module
os 모듈을 사용해 디렉토리를 생성하거나 해당 파일 디렉토리가 존재하는지 확인할 수 있다.
1
2
3
4
5
6
7
8
9
import os
os.path.isfile("test.txt") # 파일일경우 True반환
os.path.isdir("testdir") # 디렉토리일 경우 True반환
os.mkdir("testdir") # 디렉토리 생성 이미 있을 경우 error발생
os.path.exists("test") # 파일이나 디렉토리가 존재할 경우 True
os.path.join("testdir", "test.txt")
# 디렉토리를 합쳐주게됨 일반 문자열로 처리하면 os별로 디렉토리 구분 기준값이 다르기 떄문에
# 원하지 않는 결과가 나올 수 있음
shutil module
1
2
3
4
5
import shutil
source = "test.txt"
dest = os.path.join("testdir", "copy_test.txt")
shutil.copy(source, dest) # source 파일을 dest로 복사
pathlib module
1
2
3
4
5
6
7
import pathlib
cwd = pathlib.Path.cwd() # 현재 working dir을 받아옴(절대경로)
cwd.parent # cwd기준 상위 디렉토리까지
list(cwd.parent.parents) # 모든 parent들을 list에 담아줌
list(cwd.glob("*")) # 현재 디렉토리에 모든 파일, 디렉토리 목록을 가져옴
Pickle
프로그램 실행 중 생성된 객체는 메모리상에 올라가 있다가 프로그램이 종료되면 사라지게된다. 이러한 객체를 영속화할 수 있는것이 Pickle이다. 데이터, object등 프로그램 실행 중 정보를 저장해 이후에 불러와서 사용가능하게 해준다.
1
2
3
4
5
6
7
8
9
10
11
12
import pickle
f = open("list.pickle", "wb") # 바이너리파일
test = [1,2,3,4,5]
pickle.dump(test, f)
f.close()
del test # list를 지워버림
f = open("list.pickle", "rb")
test = pickle.load(f) # 이전 dump해놨던 정보를 가져옴
f.close()
Logging
logging module
logging module은 logger를 선언하는것으로 사용할 수 있다.
1
2
3
import logging
logger = logging.getLogger("main")
main은 해당 logger의 이름으로 생각하면된다. logger를 생성하였으면 해당 logger의 level을 지정해주어야한다. logger은 지정된 level이상의 log만 처리해준다.
1
2
logging.basicConfig(level=logging.INFO) # 기본적인 logger들의 level설정
logger.setLevel(logging.ERROR) # 내가 생성한 main이라는 이름의 logger의 level 설정
debug
개발시 처리 기록을 남겨야하는 로그 정보를 남긴다.
info
처리가 진행되는 정보를 알림
warning
개발시 의도하지 않은 정보가 들어왔을 때 알림
error
잘못된 처리로 인해 에러가 발생, 프로그램은 동작할 수 있음
critical
잘못된 처리로 데이터 소실, 더이상 프로그램이 동작할 수 없음
1
2
3
4
5
logger.debug("틀렸어") # debug level의 로그이고 로그 메시지는 "틀렸어"
logger.info("check") # INFO levle의 로그이고 로그 메시지는 "check"
logger.warning("warn")
logger.error("error")
logger.critical("end...")
기본적으로 logging은 표준 출력으로 나오게된다. FileHandler을 사용해 특정 파일로 logging을 할 수 있게 설정할 수 있다.
1
2
stream_handler = logging.FileHandler("log.log", mode="a", encoding="utf8")
logger.addHandler(stream_handler)
log formatter
Log의 format을 지정할 수 있다.
formatter = logging.Formatter("%(asctime)s %(levelname)s %(process)d %(message)s")
config
로깅을 위해 다양한 설정이 필요하다. 이러한 log를 위한 설정 뿐만 아니라 다른 다양한 설정들을 configparser, argparser를 사용해 처리할 수 있다.
configparser
프로그램의 실행 설정을 파일로 저장한다. section, key, value값의 형태로 설정된 파일을 사용하고, 설정 파일은 Dict Type으로 호출해 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
## config.cfg ## [SectionOne] Status: Single Name: kms Value: Yes [SectionTwo] name: xx ## .py file ## import configparser config = configparser.ConfigParser() # config parser 생성 config.read("config.cfg") # config 파일 read config.sections() # config 파일에 존재한 section들 읽어오기 for key in config["SectionOne]: print(key) print(config["SectionOne"][key])
argparser
Console창에서 프로그램 실행시 Setting정보를 저장한다. (argv를 파싱해 적절한 동작을 구현하는 것인듯) 실행 시점에 옵션을 통해 하는것
data handling
csv(comma separate value)
필드를 쉼표로 구분한 텍스트 파일, 엑셀 양식의 데이터를 프로그램에 상관없이 사용하기 위해 사용하는 데이터 형식이라고 생각하면 된다. tsv(탭), ssv(공백) 처럼 다른 구분문자로 구분되어있는 데이터도 존재한다. 엑셀에서 다른이름 저장기능으로 csv타입의 파일을 저장할 수있다. csv파일을 처리할 때 보통 lien별로 내용을 읽어 split을 사용하는데 문장자체에 콤마가 포함된 경우 잘못된 결과를 얻을 수 있다.
위의 문제를 해결하기 위해 CSV객체를 사용하면된다.
1
2
import CSV
reader = csv.reader(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
- delimiter : 글자를 나누는 기준
- linterminator : 줄 바꿈 기준
- quotechar : 문자열을 둘러싸는 신호 문자, 이 문자로 둘러싸여진 문자열은 하나의 필드로 보게된다. 즉 queotechar 가 “이고 delimiter가 ,일때 “asd, as”는 하나의 필드로 인식되어 나뉘지 않는다.
- quoting : Level 지정 (이부분 정리 다시)
urllib.request
urllib.request를 사용해 해당 url의 html을 가져올 수 있다.
1
2
3
4
5
import urllib.request
url = "http://naver.com"
html = urllib.request.urlpoen(url)
html_contents = str(html.read().decode("utf8"))
XML
데이터의 구조와 의미를 설명하는 TAG를 사용하여 표시하는 언어디다. TAG와 TAG사이에 값이 표시되고 구조적인 정보를 표현할 수 있으며, HTML과 문법이 비슷하다.
beautifulsoup
1 2 3 4 5 6 7 8 9
from bs4 import BeautifulSoup with open("books.xml", "r", encoding="utf8") as book_file: books_xml = books_file.read() soup = BeautifulSoup(books_xml, "lxml") # books_xml을 lxml파서를 사용해서 객체 생성 for book_info in soup.find_all("author"): # find_all은 Tag를 맞는 print(book_info) print(book_info.get_text()) # get_text는 Tag에 싸여있는 data를 반환
JSON (JavaScript Object Notation)
java Script의 데이터 객체 표현 방식으로 간결하고 데이터 용량이 적고, Code로의 전환이 쉽다.
python의 Dict Type과 유사해 전환이 쉽다. json모듈을 사용해 쉽게 파싱 및 저장이 가능하고 데이터 저장 및 읽기는 dict와 호환 가능하다.
read는 load, write는 dump명령어를 사용해 할 수 있다.
1
2
3
4
5
import json
with open("example.json", "r", encoding="utf8") as f:
contents = f.read()
json_data = json.loads(contents)