Exception(예외)
파이썬에서 Exception은 프로그램 실행 중 예기치 않은 상황이 발생했을 때 사용자에게 알리거나, 예외 상황을 처리하기 위해 사용됩니다.
Exception은 보통 try-except 문으로 처리됩니다. try 블록에서 예외가 발생하면 except 블록에서 예외를 처리합니다. 다음은 간단한 try-except 블록의 예시입니다.
try:
# 예외가 발생할 가능성이 있는 코드
result = 10 / 0
except ZeroDivisionError as e:
# 예외가 발생한 경우 처리할 코드
print("예외가 발생했습니다:", e)
위 코드에서 0으로 나누는 연산을 수행하면 ZeroDivisionError 예외가 발생합니다. 이 예외를 try-except 문으로 처리하면 "예외가 발생했습니다: division by zero"와 같은 메시지가 출력됩니다.
파이썬에서는 내장 예외 클래스뿐 아니라 사용자가 직접 예외 클래스를 정의할 수도 있습니다.
내장 예외 클래스는 다양한 종류가 있으며, 발생 가능한 예외 상황에 따라 적절한 예외 클래스를 사용하는 것이 좋습니다.
Exception 처리는 프로그램의 안정성과 신뢰성을 높이기 위해 매우 중요합니다. 따라서 예외 처리 코드를 적절히 작성하여 예외가 발생하더라도 프로그램이 안정적으로 종료되도록 하는 것이 좋습니다.
built-in Exception의 종류
- BaseException: 모든 내장 예외 클래스의 기본 클래스
- Exception: 대부분의 내장 예외 클래스가 이 클래스를 상속받음
- AssertionError: assert 문이 실패할 때 발생하는 예외 클래스
- AttributeError: 객체의 속성에 접근할 때 해당 속성이 존재하지 않을 때 발생하는 예외 클래스
- EOFError: 파일의 끝을 읽어들일 때 발생하는 예외 클래스
- ImportError: 모듈을 가져올 수 없을 때 발생하는 예외 클래스
- IndexError: 시퀀스에서 인덱스 범위를 벗어나는 인덱스를 사용했을 때 발생하는 예외 클래스
- KeyError: 딕셔너리에서 존재하지 않는 키를 사용했을 때 발생하는 예외 클래스
- NameError: 존재하지 않는 이름(변수, 함수, 모듈 등)을 사용했을 때 발생하는 예외 클래스
- OSError: 운영체제에서 발생하는 예외 클래스의 기본 클래스
- FileNotFoundError: 존재하지 않는 파일을 열려고 했을 때 발생하는 예외 클래스
- PermissionError: 파일에 대한 권한이 없거나 잘못된 권한으로 접근하려 할 때 발생하는 예외 클래스
- TypeError: 데이터 타입이 올바르지 않을 때 발생하는 예외 클래스
- ValueError: 데이터 값이 올바르지 않을 때 발생하는 예외 클래스
- ZeroDivisionError: 0으로 나누기와 같은 연산이 발생할 때 발생하는 예외 클래스
raise 문
raise문은 현재 실행 중인 코드 블록에서 예외를 발생시키며, 발생시킨 예외는 해당 예외 클래스의 객체로 표현됩니다.
raise 예외클래스([인자])
raise ZeroDivisionError("0으로 나눌 수 없습니다.")
위에서 인자는 해당 예외 클래스의 생성자에 전달될 값입니다. 만약 인자를 생략하면 예외 객체는 기본 인자 없이 생성됩니다.
raise문이 실행되면 예외 객체가 생성되고, 이 객체는 파이썬 인터프리터에 의해 예외 처리 과정으로 전달됩니다. 예외 처리 과정에서는 호출 스택을 타고 올라가며, 가장 가까운 예외 처리기(handler)를 찾아서 예외 처리를 합니다. 만약 예외 처리기가 없으면 프로그램이 종료됩니다.
assert
assert문은 조건이 참이 아닌 경우 AssertionError를 발생시킵니다. assert문은 다음과 같이 사용됩니다.
assert 조건, [에러메시지]
assert isinstance(obj, type)
조건이 참이 아니면 AssertionError가 발생합니다. 에러메시지는 선택적으로 지정할 수 있으며, 에러메시지는 조건이 참이 아닌 경우 AssertionError 메시지와 함께 출력됩니다.
파일의 종류
- 텍스트 파일 (Text File)
텍스트 파일은 ASCII, UTF-8, ISO-8859 등과 같은 문자열을 포함하는 파일입니다. 이러한 파일들은 일반적으로 읽을 수 있으며, 인코딩을 지정함으로써 파이썬에서도 쉽게 처리할 수 있습니다. 예를 들어, 파이썬에서는 텍스트 파일을 열 때 open() 함수를 사용하며, 기본적으로 텍스트 모드로 열리게 됩니다.
- 이진 파일 (Binary File)
이진 파일은 텍스트 파일과 달리 문자열을 포함하지 않으며, 주로 이미지, 동영상, 오디오 등과 같은 바이너리 데이터를 포함합니다. 이러한 파일들은 바이너리 데이터를 직접 다루는 방식으로 처리해야 하며, open() 함수에서 b 옵션을 사용하여 바이너리 모드로 열어야 합니다.
파일 다루기
open() 함수는 파일을 읽기, 쓰기, 추가하기 등의 모드로 열 수 있으며, 파일 객체를 반환합니다. 반환된 파일 객체를 사용하여 파일을 읽거나 쓸 수 있습니다. 다음은 파일을 열고 읽는 예제입니다.
# 파일 열기
file = open('file.txt', 'r') # 파일 이름과 모드 지정
# 파일 읽기
contents = file.read() # 파일 전체를 문자열로 읽기
# 파일 닫기
file.close()
위의 예제에서 open() 함수의 두 번째 인자로 'r'을 지정하여 파일을 읽기 모드로 열었습니다. 파일 객체에서 read() 메서드를 호출하여 파일 전체를 읽어들이고, 파일을 다 사용한 후에는 close() 메서드를 호출하여 파일을 닫습니다.
파일 읽기
- read() 메소드: 파일 내용 전체를 문자열 형태로 읽어들입니다.
- readlines() 메소드: 파일 내용 전체를 줄 단위로 읽어들여, 리스트 형태로 반환합니다.
- readline() 메소드: 파일 내용을 한 줄씩 읽어들입니다.
read() 메소드
read() 메소드를 사용하면 파일의 전체 내용을 문자열 형태로 읽어들일 수 있습니다. read() 메소드는 파일을 끝까지 읽어들이기 때문에, 이후에 다시 파일을 읽으려면 파일을 다시 열어야 합니다.
다음은 read() 메소드를 사용하여 파일을 읽는 간단한 예제입니다.
with open("file.txt", "r") as f:
contents = f.read()
print(contents)
readlines() 메소드
readlines() 메소드를 사용하면 파일 내용 전체를 줄 단위로 읽어들여, 리스트 형태로 반환합니다. 각 줄의 끝에 있는 개행 문자(\n)는 포함합니다.
다음은 readlines() 메소드를 사용하여 파일을 읽는 간단한 예제입니다.
with open("file.txt", "r") as f:
lines = f.readlines()
for line in lines:
print(line)
위의 예제에서는 readlines() 메소드를 사용하여 파일 내용 전체를 읽어들입니다. 이후에는 for 반복문을 사용하여 리스트의 각 요소를 출력합니다.
readline() 메소드
readline() 메소드를 사용하면 파일 내용을 한 줄씩 읽어들일 수 있습니다. 파일 끝에 도달하면 빈 문자열('')을 반환합니다.
다음은 readline() 메소드를 사용하여 파일을 읽는 간단한 예제입니다.
with open("file.txt", "r") as f:
while True:
line = f.readline()
if not line:
break
print(line)
위의 예제에서는 readline() 메소드를 사용하여 파일을 한 줄씩 읽어들입니다. 파일 끝에 도달하면 while 반복문에서 빠져나옵니다.
파일쓰기
open() 함수를 사용하여 파일을 열고 파일 객체를 생성합니다. open() 함수의 두 번째 매개변수 mode는 파일을 열 때 사용할 모드를 지정하는데, 파일을 쓰기 모드로 열 때는 "w" 또는 "wb" 모드를 사용합니다.
파일에 쓰기 위해 파일 객체의 write() 메소드를 사용할 수 있습니다. 이 때, 문자열을 파일에 쓰는데, 이때 파일에 쓰이는 문자열의 인코딩 방식을 지정할 수 있습니다.
파일을 쓰기 모드로 열 때, encoding 매개변수를 사용하여 인코딩 방식을 지정할 수 있습니다. 예를 들어, UTF-8 인코딩 방식으로 파일을 쓰려면 다음과 같이 작성합니다.
f = open("file.txt", "w", encoding="utf-8")
f.write("안녕하세요, 세상!")
f.close()
with open("file.txt", "w", encoding="utf-8") as f:
f.write("안녕하세요, 세상!")
위 코드에서, open() 함수의 세 번째 매개변수 encoding에 "utf-8"을 지정하여 파일에 쓰이는 문자열을 UTF-8 방식으로 인코딩합니다.
파이썬에서 Directory 다루기
os로 다루
디렉토리 생성하기
디렉토리를 생성하기 위해서는 os 모듈의 mkdir() 함수를 사용합니다. 이 함수는 지정된 경로에 디렉토리를 생성합니다
import os
os.mkdir("example_directory")
현재 디렉토리 확인하기
os 모듈의 getcwd() 함수를 사용하면 현재 작업 디렉토리를 확인할 수 있습니다.
import os
cwd = os.getcwd()
print(cwd)
디렉토리 변경하기
현재 작업 디렉토리를 변경하려면 os 모듈의 chdir() 함수를 사용합니다.
import os
os.chdir("example_directory")
디렉토리 목록 가져오기
디렉토리 내의 파일 및 하위 디렉토리 목록을 가져오기 위해서는 os 모듈의 listdir() 함수를 사용합니다.
import os
files = os.listdir(".")
print(files)
디렉토리 삭제하기
디렉토리를 삭제하려면 os 모듈의 rmdir() 함수를 사용합니다.
import os
os.rmdir("example_directory")
주의: rmdir() 함수는 오직 빈 디렉토리만 삭제할 수 있습니다.
pathlib으로 다루기
pathlib 모듈은 파일시스템 경로를 다루기 위한 객체지향적인 인터페이스를 제공하는 파이썬 표준 라이브러리 모듈입니다.
pathlib 모듈의 주요 클래스는 Path 클래스입니다. Path 클래스는 경로를 나타내는 객체로, 파일 및 디렉토리 관리 기능을 제공합니다. Path 클래스는 다음과 같은 주요 메소드를 제공합니다.
- joinpath(): 경로를 연결합니다.
- (+로 연결시 윈도우, 맥, 리눅스 호환 문제 생길 가능성있음.)
- exists(): 경로가 존재하는지 확인합니다.
- mkdir(): 디렉토리를 생성합니다.
- rmdir(): 디렉토리를 삭제합니다.
- glob(): 경로에 매칭되는 파일 및 디렉토리 리스트를 반환합니다.
- rename(): 파일 또는 디렉토리의 이름을 변경합니다.
- unlink(): 파일을 삭제합니다.
- is_dir(): 경로가 디렉토리인지 확인합니다.
- is_file(): 경로가 파일인지 확인합니다.
from pathlib import Path
# 현재 작업 디렉토리를 Path 객체로 가져오기
current_directory = Path.cwd()
# .txt 확장자를 가진 파일들의 경로 가져오기
txt_files = current_directory.glob('*.txt')
# 각 파일의 이름과 크기 출력
for file in txt_files:
print(f'File name: {file.name}, Size: {file.stat().st_size} bytes')
이 코드에서 Path.cwd() 함수를 사용하여 현재 작업 디렉토리를 Path 객체로 가져옵니다. 그런 다음 glob() 메소드를 사용하여 해당 디렉토리에서 .txt 확장자를 가진 모든 파일의 경로를 가져옵니다. 마지막으로 name 속성을 사용하여 파일 이름과 stat().st_size 메소드를 사용하여 파일 크기를 가져와 출력합니다.
pickle
pickle 모듈을 사용하면 객체를 파일에 쓸 수 있으며, 나중에 다시 읽어올 수 있습니다. 이를 통해 객체를 디스크에 저장하고 다시 로드할 수 있으므로 데이터를 영속화(persistence)하는 데 유용합니다.
pickle 모듈은 다양한 파이썬 객체를 직렬화하고 역직렬화할 수 있습니다. pickle 모듈로 직렬화할 수 있는 객체의 예는 다음과 같습니다.
- 숫자, 문자열, 튜플, 리스트, 딕셔너리, 집합 등의 기본 자료형
- 사용자 정의 클래스의 인스턴스
- 함수, 모듈 등의 파이썬 객체
다음은 pickle 모듈을 사용하여 객체를 파일에 쓰고 다시 로드하는 예제입니다.
import pickle
# 객체를 파일에 쓰기
data = {'a': 1, 'b': 2, 'c': 3}
with open('data.pkl', 'wb') as f:
pickle.dump(data, f)
# 파일에서 객체 읽어오기
with open('data.pkl', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data)
이 코드에서 pickle.dump() 함수를 사용하여 data 딕셔너리 객체를 파일에 쓰고, pickle.load() 함수를 사용하여 파일에서 데이터를 읽어 loaded_data 변수에 저장합니다. 마지막으로, loaded_data 변수를 출력하여 파일에서 읽어온 객체를 확인합니다.
주의해야 할 점은 pickle 모듈을 사용하여 파일을 쓰거나 읽을 때 파일 모드로 wb와 rb를 사용해야 한다는 점입니다.
Log Handling
파이썬에서 logging은 로그 메시지를 기록하고 저장하는 데 사용되는 모듈입니다. 로깅은 프로그램의 실행 중에 정보를 기록하고 디버깅 및 문제 해결을 지원합니다. 로깅을 사용하면 프로그램 실행 중에 발생하는 문제를 추적하고 수정하는 것이 더 쉬워집니다.
다음은 logging 모듈에서 자주 사용되는 로그 레벨입니다.
- DEBUG: 가장 낮은 로그 레벨로, 디버깅을 위한 상세한 정보를 기록합니다.
- INFO: 일반적인 정보를 기록합니다.
- WARNING: 경고 메시지를 기록합니다. 프로그램 실행에는 문제가 없지만, 주의가 필요한 상황에 사용됩니다.
- ERROR: 오류 메시지를 기록합니다. 프로그램 실행 중에 발생한 오류와 같이 프로그램이 계속 실행될 수 없는 상황에 사용됩니다.
- CRITICAL: 가장 높은 로그 레벨로, 치명적인 오류 메시지를 기록합니다. 프로그램이 중단되거나, 실행을 멈추어야 하는 상황에 사용됩니다.
logging 모듈에서는 로그 메시지를 파일, 콘솔, 이메일 등으로 출력할 수 있습니다. 로그 핸들러는 로그 메시지를 처리하는 방법을 정의합니다. logging 모듈에서는 다양한 로그 핸들러가 제공되며, 로그를 기록하는 방법에 따라 선택할 수 있습니다.
logging 모듈에서 로거를 사용하는 방법은 다음과 같습니다.
import logging
# 로거 생성
logger = logging.getLogger(__name__)
# 로그 레벨 설정
logger.setLevel(logging.DEBUG)
# 로그 핸들러 생성
handler = logging.StreamHandler()
# 로그 핸들러에 로그 포맷 설정
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 로거에 로그 핸들러 추가
위에서 봤드이 사전에 설정해줘야 할것이 많다. 이 때 설정하는 방법에 2가지가 있다.
1. configparser
2. argparser
configparser와 argparse는 각각 설정 파일과 명령행 인자를 다루기 위한 파이썬 표준 라이브러리 모듈입니다.
configparser는 ini 형식의 설정 파일을 읽고 쓰기 위한 모듈입니다.
ini 파일은 텍스트 파일 형태로 키-값 쌍을 가지는 설정 파일입니다.
configparser를 사용하여 ini 파일을 읽고 쓰기 쉽게 파싱할 수 있습니다.
argparse는 명령행 인자를 파싱하기 위한 모듈입니다.
명령행 인자는 명령 프롬프트에서 스크립트에 전달되는 인자로, 예를 들어 python script.py arg1 arg2와 같은 형태로 전달됩니다.
argparse를 사용하여 이러한 인자를 쉽게 파싱하고 처리할 수 있습니다. argparse는 명령행 인자의 유효성 검사와 도움말 출력 등 다양한 기능을 제공합니다.
'언어 공부 > Python' 카테고리의 다른 글
Data 종류, 정규식 (0) | 2023.03.07 |
---|---|
모듈, 패키지, 프로젝트 (0) | 2023.03.07 |
파이썬에서의 객체 지향 프로그래밍 (0) | 2023.03.06 |
파이썬식 문법 + 함수 심화 개념 (0) | 2023.03.06 |
문자열과 함수 심화 개념 (0) | 2023.03.06 |