Lesson 9

파일 입출력과 예외 처리

4 min Views 3

open()으로 파일 읽고 쓰기, try/except/finally로 오류 안전하게 처리하기

이번 강에서 배울 것

  • open()으로 파일 열기 — 읽기(r), 쓰기(w), 추가(a) 모드
  • 파일 읽기 — read(), readline(), readlines()
  • 파일 쓰기 — write(), writelines()
  • with 문 — 자동으로 파일 닫기
  • 예외(Exception) 처리 — try/except/else/finally

1. 파일 입출력이 왜 필요한가

지금까지 만든 프로그램은 종료되면 모든 데이터가 사라집니다. 파일 입출력(File I/O)을 사용하면 데이터를 파일에 저장하고 다시 읽어올 수 있습니다. 로그 기록, 설정 파일 읽기, CSV 데이터 분석 등 실무에서 매우 자주 사용됩니다.

# 파일 모드
# "r"  → 읽기  (기본값, 파일 없으면 오류)
# "w"  → 쓰기  (파일 없으면 생성, 있으면 덮어씀!)
# "a"  → 추가  (파일 없으면 생성, 있으면 이어쓰기)
# "x"  → 쓰기  (파일 없을 때만 생성, 있으면 오류)
# "r+" → 읽기+쓰기
# "b"를 붙이면 바이너리 모드 (예: "rb", "wb")

# 기본 파일 열기/닫기
f = open("test.txt", "w", encoding="utf-8")
f.write("안녕하세요!\n")
f.write("파이썬 파일 쓰기 테스트입니다.\n")
f.close()    # 반드시 닫아야 함! → with 문 사용 권장

2. with 문 — 파일 자동 닫기

# with 문: 블록이 끝나면 자동으로 파일을 닫아줌
# f.close() 를 잊어버리는 실수 방지 → 항상 with 사용 권장

# 파일 쓰기
with open("hello.txt", "w", encoding="utf-8") as f:
    f.write("첫 번째 줄\n")
    f.write("두 번째 줄\n")
    f.write("세 번째 줄\n")
# with 블록이 끝나면 자동으로 f.close() 호출됨

# 파일 읽기 - read(): 전체를 하나의 문자열로
with open("hello.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)
# → 첫 번째 줄
# → 두 번째 줄
# → 세 번째 줄

# readline(): 한 줄씩 읽기
with open("hello.txt", "r", encoding="utf-8") as f:
    line1 = f.readline()    # "첫 번째 줄\n"
    line2 = f.readline()    # "두 번째 줄\n"
    print(line1.strip())    # .strip()으로 \n 제거

# readlines(): 모든 줄을 리스트로
with open("hello.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for line in lines:
        print(line.strip())

3. 파일 이어쓰기와 활용 예제

# 추가 모드 "a": 기존 내용 유지하고 이어쓰기
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("2024-01-15 10:30 사용자 로그인\n")

with open("log.txt", "a", encoding="utf-8") as f:
    f.write("2024-01-15 11:00 데이터 조회\n")

# writelines(): 리스트를 한 번에 쓰기 (줄바꿈 직접 추가)
students = ["김민준\n", "이수진\n", "박철수\n"]
with open("students.txt", "w", encoding="utf-8") as f:
    f.writelines(students)

# 실용 예제: 간단한 메모장
def save_memo(filename, text):
    with open(filename, "a", encoding="utf-8") as f:
        f.write(text + "\n")

def read_memos(filename):
    try:
        with open(filename, "r", encoding="utf-8") as f:
            return f.readlines()
    except FileNotFoundError:
        return []

save_memo("memo.txt", "파이썬 공부하기")
save_memo("memo.txt", "점심 먹기")
memos = read_memos("memo.txt")
for i, memo in enumerate(memos, 1):
    print(f"{i}. {memo.strip()}")

4. 예외 처리 — try / except

프로그램 실행 중 예상치 못한 오류(예외, Exception)가 발생하면 프로그램이 강제 종료됩니다. try/except로 오류를 잡아 안전하게 처리할 수 있습니다.

# 기본 구조
try:
    # 오류가 발생할 수 있는 코드
    result = 10 / 0
except ZeroDivisionError:
    # 오류 발생 시 실행할 코드
    print("0으로 나눌 수 없습니다!")

# 여러 예외 처리
try:
    num = int(input("숫자를 입력하세요: "))
    result = 100 / num
    print(f"결과: {result}")
except ValueError:
    print("숫자만 입력해주세요.")
except ZeroDivisionError:
    print("0은 입력할 수 없습니다.")
except Exception as e:
    print(f"예상치 못한 오류: {e}")   # 모든 예외 처리

# else: 예외 없이 성공했을 때
# finally: 예외 여부와 상관없이 항상 실행
try:
    f = open("data.txt", "r")
    data = f.read()
except FileNotFoundError:
    print("파일이 없습니다.")
    data = ""
else:
    print("파일을 성공적으로 읽었습니다.")
finally:
    print("항상 실행됩니다.")    # 파일 닫기, 정리 작업에 사용

5. 자주 만나는 예외 종류

예외명 발생 상황 예시
ValueError잘못된 값 변환int("abc")
ZeroDivisionError0으로 나누기10 / 0
IndexError리스트 범위 초과[1,2][5]
KeyError딕셔너리 없는 키d["없는키"]
FileNotFoundError파일 없음open("없음.txt")
TypeError자료형 불일치 연산"5" + 3
# 실전: 안전한 숫자 입력 함수
def get_number(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("숫자만 입력하세요. 다시 시도합니다.")

age = get_number("나이를 입력하세요: ")
print(f"입력한 나이: {age}")

9강 핵심 요약

  • open("파일명", "모드", encoding="utf-8") — 한국어 파일은 utf-8 인코딩 필수
  • with 문으로 파일 열기 — 자동 close(), 가장 안전한 방법
  • "w" 모드는 기존 내용 덮어씀 주의 — 이어쓰기는 "a" 모드
  • try/except: 예외 발생 시 프로그램 강제 종료 방지
  • finally: 성공·실패 무관하게 항상 실행 — 자원 정리에 활용
  • 다음 강: 클래스와 OOP — 파이썬의 객체지향 프로그래밍 기초

관련 검색어  ·  파이썬파일입출력, open함수파이썬, with문파이썬, 파이썬예외처리, try except파이썬, FileNotFoundError, 파이썬읽기쓰기

Advertisement

0 Comments

채용정보
공지사항
인사이트
MY