예외 처리와 파일 처리¶
Ⅶ 예외 처리¶
01. 예외 처리란?¶
프로그램은 실행 중에 예상치 못한 상황이 생길 수 있습니다.
int("hello") # ValueError
10 / 0 # ZeroDivisionError
[1,2,3][10] # IndexError
이런 상황이 발생하면 파이썬은 예외(Exception)를 발생시키고, 처리하지 않으면 프로그램이 멈춥니다.
예외 처리란 이런 오류 상황을 미리 대비하여 프로그램이 계속 실행될 수 있도록 하는 것입니다.
try / except 기본 구조¶
try:
# 오류가 생길 수 있는 코드
x = int(input("숫자: "))
print(10 / x)
except ValueError:
print("숫자를 입력하세요.")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
숫자: hello
숫자를 입력하세요.
숫자: 0
0으로 나눌 수 없습니다.
실행 흐름¶
try 블록 실행
↓ 오류 발생? ──→ 해당 except 블록 실행 → 이후 코드 계속
↓ 오류 없음?
이후 코드 계속
else / finally¶
try:
x = int(input("숫자: "))
result = 10 / x
except (ValueError, ZeroDivisionError) as e:
print(f"오류: {e}")
else:
print(f"결과: {result}") # 오류가 없을 때만 실행
finally:
print("항상 실행") # 오류 여부와 상관없이 항상 실행
| 절 | 실행 시점 |
|---|---|
try |
항상 시도 |
except |
오류 발생 시 |
else |
오류 없을 때 |
finally |
항상 (오류 여부 무관) |
02. 주요 예외 종류¶
| 예외 | 발생 상황 | 예시 |
|---|---|---|
ValueError |
잘못된 값 변환 | int("hello") |
ZeroDivisionError |
0으로 나누기 | 10 / 0 |
IndexError |
범위 벗어난 인덱스 | [1,2][5] |
KeyError |
없는 딕셔너리 키 | {"a":1}["b"] |
TypeError |
타입 불일치 | "1" + 1 |
FileNotFoundError |
없는 파일 열기 | open("x.txt") |
AttributeError |
없는 속성/메서드 | "hi".append(1) |
# 모든 예외를 잡는 방법 (권장하지 않음 — 원인 파악 어려움)
try:
...
except Exception as e:
print(f"예외 발생: {e}")
raise — 예외 직접 발생¶
def set_age(age):
if age < 0:
raise ValueError("나이는 0 이상이어야 합니다.")
return age
try:
set_age(-1)
except ValueError as e:
print(e) # 나이는 0 이상이어야 합니다.
Ⅷ 파일 처리¶
01. 파일 처리란?¶
파일 처리란 프로그램에서 파일을 열고, 읽고, 쓰고, 닫는 작업입니다.
f = open("파일경로", "모드")
# 작업
f.close()
파일 모드¶
| 모드 | 의미 |
|---|---|
"r" |
읽기 (기본값, 파일 없으면 오류) |
"w" |
쓰기 (파일 새로 생성, 기존 내용 삭제) |
"a" |
추가 (기존 내용 유지, 뒤에 추가) |
"x" |
생성 (파일이 이미 있으면 오류) |
with 문 (권장)¶
with open("hello.txt", "w") as f:
f.write("Hello, World!")
# with 블록이 끝나면 자동으로 f.close() 호출
with 문을 사용하면 예외가 발생해도 파일이 자동으로 닫힙니다.
02. 파일 저장하기¶
write() — 문자열 쓰기¶
with open("memo.txt", "w", encoding="utf-8") as f:
f.write("첫 번째 줄\n")
f.write("두 번째 줄\n")
memo.txt 내용:
첫 번째 줄
두 번째 줄
writelines() — 리스트 한 번에 쓰기¶
lines = ["사과\n", "바나나\n", "딸기\n"]
with open("fruits.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
추가 모드 (append)¶
with open("memo.txt", "a", encoding="utf-8") as f:
f.write("세 번째 줄\n")
# 기존 내용을 지우지 않고 뒤에 추가
03. 파일 불러오기¶
read() — 전체 읽기¶
with open("memo.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
readline() — 한 줄씩 읽기¶
with open("memo.txt", "r", encoding="utf-8") as f:
line1 = f.readline() # "첫 번째 줄\n"
line2 = f.readline() # "두 번째 줄\n"
print(line1.strip()) # strip()으로 \n 제거
readlines() — 줄 단위 리스트¶
with open("memo.txt", "r", encoding="utf-8") as f:
lines = f.readlines() # ["첫 번째 줄\n", "두 번째 줄\n", ...]
for line in lines:
print(line.strip())
for 반복문으로 읽기 (대용량 파일에 적합)¶
with open("memo.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
파일 처리 + 예외 처리 조합¶
try:
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("파일이 없습니다.")
except PermissionError:
print("파일을 열 권한이 없습니다.")
실습 미션¶
미션 1: 예외 처리 실습¶
1. 사용자로부터 두 숫자를 입력받아 나누는 함수를 만드세요.
2. ValueError (숫자가 아닌 입력)와 ZeroDivisionError를 모두 처리하세요.
3. 성공하면 결과를, 실패하면 오류 메시지를 출력하세요.
미션 2: 파일 쓰기¶
1. 사용자가 입력한 텍스트를 "output.txt"에 저장하세요.
2. 프로그램을 다시 실행해도 기존 내용에 추가되도록 하세요 ("a" 모드).
미션 3: 파일 읽기¶
1. "output.txt" 파일을 읽어서 줄 번호와 함께 출력하세요.
예:
1: 안녕하세요
2: 반갑습니다
미션 4 (심화): 단어 빈도 계산¶
1. 텍스트 파일을 읽어서 각 단어가 몇 번 등장하는지 세세요.
2. 빈도가 높은 순으로 상위 5개 단어를 출력하세요.
핵심 요약¶
| 개념 | 설명 |
|---|---|
try / except |
예외 발생 시 처리 — 프로그램 중단 방지 |
else |
예외 없을 때 실행 |
finally |
예외 여부 무관, 항상 실행 |
raise |
예외 직접 발생 |
open(path, mode) |
파일 열기 |
"w" / "a" / "r" |
쓰기 / 추가 / 읽기 모드 |
with 문 |
자동 close — 예외 발생해도 안전 |
encoding="utf-8" |
한글 파일 처리 시 필수 |
파일을 열 때는 항상
with문을 사용하고,encoding="utf-8"을 지정하세요.