콘텐츠로 이동

예외 처리와 파일 처리

Ⅶ 예외 처리

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"을 지정하세요.