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") |
| ZeroDivisionError | 0으로 나누기 | 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