본문 바로가기
코딩교육/Python 초등교육에서 전문가까지

2단계 : 6. 파일 작업 중 예외 처리 (파일이 없는 경우)

by 제리토리 2025. 4. 1.
728x90
반응형

 

Python에서 파일을 읽거나 쓸 때는 예상치 못한 다양한 예외가 발생할 수 있습니다. 그중에서도 가장 자주 마주치는 문제는 존재하지 않는 파일을 열려고 할 때 발생하는 FileNotFoundError 예외입니다.

 

이 장에서는 Python의 파일 입출력(I/O)에서 발생할 수 있는 예외 처리 기법

파일이 없는 경우를 안전하게 처리하는 방법과 실전적인 예외 대응 전략을 집중적으로 다룹니다.

 

 

1. 예외 처리의 필요성

 

Python에서 파일을 열기 위해 open() 함수를 사용할 때,

파일이 존재하지 않는 경로를 지정하면 FileNotFoundError가 즉시 발생합니다.

 

예시:

file = open("없는파일.txt", "r")  # 존재하지 않는 파일

 

📌 결과

FileNotFoundError: [Errno 2] No such file or directory: '없는파일.txt'

예외 처리(Exception Handling)를 통해 프로그램이 멈추지 않고, 적절한 대체 로직을 수행할 수 있도록 해야 합니다.

 

 

 

2. try / except 블록을 활용한 기본 예외 처리

 

㉮ 기본 구조

try:
    with open("data.txt", "r", encoding="utf-8") as f:
        content = f.read()
except FileNotFoundError:
    print("파일이 존재하지 않습니다.")

 

✅ 주요 포인트

  • try 블록: 예외가 발생할 수 있는 코드

  • except FileNotFoundError: 해당 오류가 발생했을 때의 처리 코드

  • with open()을 함께 사용하면 자원도 자동 해제

 

 

3. 예외 발생 시 대체 파일 생성 or 안내

 

실무에서는 파일이 없을 경우, 자동으로 새 파일을 생성하거나 기본 데이터를 삽입하는 방식으로 처리하기도 합니다.

filename = "userdata.txt"

try:
    with open(filename, "r", encoding="utf-8") as f:
        print(f.read())
except FileNotFoundError:
    print(f"{filename} 파일이 없습니다. 새 파일을 생성합니다.")
    with open(filename, "w", encoding="utf-8") as f:
        f.write("이 파일은 자동 생성되었습니다.\n")

✅ 사용자 친화적인 메시지를 출력하고, 시스템이 정상적으로 동작하도록 “복구” 행동을 수행

 

 

4. 예외 정보 자세히 확인하기 (as e)

 

as e 구문을 사용하면 발생한 예외의 상세 정보를 확인할 수 있습니다.

try:
    open("missing.txt", "r", encoding="utf-8")
except FileNotFoundError as e:
    print(f"[오류 발생] {e}")

 

📌 출력 예시:

[오류 발생] [Errno 2] No such file or directory: 'missing.txt'

 

 

5. 다중 예외 처리 구조

 

파일 입출력에서는 단순히 파일이 없을 뿐 아니라, 쓰기 권한이 없거나 디렉토리 경로가 잘못된 경우도 발생합니다.

try:
    with open("somefile.txt", "r", encoding="utf-8") as f:
        data = f.read()
except FileNotFoundError:
    print("파일이 없습니다.")
except PermissionError:
    print("파일에 접근할 수 있는 권한이 없습니다.")
except IsADirectoryError:
    print("경로가 디렉토리입니다. 파일을 지정해 주세요.")
except Exception as e:
    print(f"예상치 못한 예외 발생: {e}")

상황에 맞는 정확한 예외 메시지를 출력함으로써, 유지보수와 디버깅을 쉽게 할 수 있습니다.

 

 

6. 예외 처리를 함수로 추상화 (실무에서 권장)
import os

def read_file_safe(filepath):
    if not os.path.exists(filepath):
        return f"[오류] {filepath} 파일이 존재하지 않습니다."

    try:
        with open(filepath, "r", encoding="utf-8") as f:
            return f.read()
    except Exception as e:
        return f"[예외 발생] {e}"

코드 중복 제거, 에러 발생 위치 격리, 테스트 용이성 증가

 

 

7. 예외 발생 후 대체 행동 (로그 기록, 사용자 알림 등)

 

실제 프로젝트에서는 단순히 에러 메시지를 출력하는 것보다 로그를 기록하거나 사용자에게 팝업을 띄우는 등

더 적극적인 대응이 필요합니다.

import datetime

def log_error(message):
    with open("error.log", "a", encoding="utf-8") as f:
        f.write(f"[{datetime.datetime.now()}] {message}\n")

try:
    open("notfound.txt", "r", encoding="utf-8")
except FileNotFoundError as e:
    log_error(str(e))

에러 로그를 남기면 시스템 모니터링과 디버깅에 큰 도움이 됩니다.

 

 

8. 요약
예외 상황 예외명 대응 방법
파일이 없음 FileNotFoundError 사용자 알림, 새 파일 생성
쓰기 권한 없음 PermissionError 관리자 권한 요청 또는 경로 변경
디렉토리 지정 IsADirectoryError 정확한 파일 경로 지정
기타 오류 Exception 로그 기록 및 디버깅용 메시지 출력

 

728x90
반응형