Python 에서 파일 not found 오류 처리 방법

PythonBeginner
지금 연습하기

소개

Python 은 파일 처리를 포함한 다양한 애플리케이션에 널리 사용되는 강력한 프로그래밍 언어입니다. 하지만, 파일이 존재하지 않는 오류를 처리하는 것은 개발자에게 흔한 과제일 수 있습니다. 이 튜토리얼은 파일이 존재하지 않는 오류를 이해하고, 이를 효과적으로 처리하는 기술과 Python 에서 견고한 파일 처리를 위한 모범 사례를 안내합니다.

이 랩에서는 try-except 블록과 os 모듈을 사용하여 Python 에서 FileNotFoundError를 처리하는 방법을 배웁니다. 또한 이러한 개념을 시연하기 위해 Python 코드를 작성하는 연습을 할 것입니다.

파일이 존재하지 않는 오류 이해

Python 에서 FileNotFoundError는 접근하려는 파일 또는 디렉토리가 존재하지 않을 때 발생하는 내장 예외입니다. 이 오류는 읽기, 쓰기 또는 추가를 위해 파일을 열려고 하거나, 존재하지 않는 디렉토리에 접근하려고 할 때와 같은 다양한 시나리오에서 발생할 수 있습니다.

FileNotFoundError는 모든 운영 체제 관련 오류의 기본 클래스인 OSError 예외의 하위 클래스입니다. FileNotFoundError는 운영 체제가 지정된 파일 또는 디렉토리를 찾을 수 없을 때 발생합니다.

이 오류가 어떻게 발생하는지 살펴보겠습니다. 터미널을 열고, 아직 해당 디렉토리에 있지 않다면 프로젝트 디렉토리로 이동합니다.

cd ~/project

이제 Python 인터프리터를 사용하여 존재하지 않는 파일을 열어보겠습니다. 터미널에 python을 입력하여 Python 대화형 셸을 시작합니다.

python

Python 셸 내에서 존재하지 않는 파일을 열어보세요.

open("non_existent_file.txt", "r")

FileNotFoundError 트레이스백을 보게 될 것입니다. 이는 파일이 발견되지 않아 Python 이 예외를 발생시켰음을 보여줍니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'non_existent_file.txt'

Python 셸을 종료하려면 exit()를 입력하세요.

exit()
FileNotFoundError 의 그림

FileNotFoundError와 그것이 어떻게 발생하는지 이해하는 것은 Python 코드에서 이를 효과적으로 처리하는 첫 번째 단계입니다.

try-except 를 사용하여 파일이 존재하지 않는 오류 처리

Python 에서 FileNotFoundError를 처리하는 가장 일반적이고 권장되는 방법은 try-except 블록을 사용하는 것입니다. 이를 통해 예외를 적절하게 포착하고 파일이 발견되지 않을 때 대체 코드를 실행할 수 있습니다.

이를 시연하기 위해 Python 스크립트를 만들어 보겠습니다.

VS Code 에서 ~/project 디렉토리에 handle_error.py라는 새 파일을 만듭니다.

cd ~/project
touch handle_error.py

이제 다음 코드를 handle_error.py에 추가합니다.

try:
    ## 존재하지 않을 수 있는 파일을 열려고 시도합니다.
    with open("my_file.txt", "r") as file:
        content = file.read()
        print("File content:")
        print(content)
except FileNotFoundError:
    ## 파일이 발견되지 않은 경우를 처리합니다.
    print("Error: The file 'my_file.txt' was not found.")
    content = "Default content because the file was not found."
    print("Using default content:")
    print(content)

print("Program continues after handling the error.")

파일을 저장합니다. 이 스크립트는 my_file.txt를 열려고 시도합니다. 파일이 존재하지 않으면 FileNotFoundError가 포착되고 메시지가 출력되며 기본 내용이 할당됩니다.

이제 터미널에서 스크립트를 실행합니다.

python handle_error.py

my_file.txt가 존재하지 않으므로 except 블록의 출력을 보게 됩니다.

Error: The file 'my_file.txt' was not found.
Using default content:
Default content because the file was not found.
Program continues after handling the error.
파일 오류 처리의 그림

이는 try-except 블록이 프로그램이 오류를 처리하고 충돌하는 대신 실행을 계속할 수 있도록 하는 방법을 보여줍니다.

os.path.exists() 를 사용하여 파일이 존재하지 않는 오류 처리

잠재적인 FileNotFoundError를 처리하는 또 다른 방법은 파일을 열기 전에 파일이 존재하는지 확인하는 것입니다. os 모듈은 이러한 목적으로 os.path.exists() 함수를 제공합니다.

os.path.exists()를 사용하도록 스크립트를 수정해 보겠습니다. VS Code 에서 handle_error.py를 다시 엽니다.

기존 코드를 다음으로 바꿉니다.

import os

file_path = "my_file.txt"

if os.path.exists(file_path):
    ## 파일이 존재하므로 열고 읽기를 진행합니다.
    try:
        with open(file_path, "r") as file:
            content = file.read()
            print("File content:")
            print(content)
    except IOError as e:
        ## 다른 잠재적인 I/O 오류를 처리합니다.
        print(f"An I/O error occurred: {e}")
else:
    ## 파일이 존재하지 않습니다.
    print(f"Error: The file '{file_path}' was not found.")
    content = "Default content because the file was not found."
    print("Using default content:")
    print(content)

print("Program continues after checking file existence.")

파일을 저장합니다. 이 스크립트는 이제 먼저 os.path.exists()를 사용하여 my_file.txt가 존재하는지 확인합니다. 존재하지 않으면 오류 메시지를 출력하고 기본 내용을 사용합니다. 존재하면 다른 잠재적인 IOError 예외를 포착하기 위해 try-except 블록 내에서 파일을 열고 읽기를 진행합니다.

터미널에서 스크립트를 다시 실행합니다.

python handle_error.py

my_file.txt가 여전히 존재하지 않으므로 이전과 동일한 출력을 얻게 됩니다.

Error: The file 'my_file.txt' was not found.
Using default content:
Default content because the file was not found.
Program continues after checking file existence.

이제 my_file.txt를 만들고 스크립트를 다시 실행해 보겠습니다. 터미널에서 echo 명령을 사용하여 파일을 만듭니다.

echo "This is the content of my_file.txt" > my_file.txt

이제 Python 스크립트를 다시 실행합니다.

python handle_error.py

이번에는 my_file.txt가 존재하므로 스크립트가 파일을 열고 읽습니다.

File content:
This is the content of my_file.txt
Program continues after checking file existence.

os.path.exists()를 사용하면 파일을 열기 전에 파일의 존재 여부에 따라 다른 작업을 수행하려는 경우 유용할 수 있습니다.

강력한 파일 처리를 위한 모범 사례

Python 에서 파일 작업을 처리할 때는 코드가 강력하고, 유지 관리 가능하며, 오류 허용적 (error-tolerant) 이 되도록 모범 사례를 따르는 것이 중요합니다.

컨텍스트 관리자 (Context Manager) 사용 (with 문)

예제에서 보았듯이 파일을 열 때 with 문을 사용하는 것은 모범 사례입니다. 오류가 발생하더라도 파일이 자동으로 닫히도록 하여 리소스 누수를 방지합니다.

try:
    with open(file_path, "r") as file:
        content = file.read()
except FileNotFoundError:
    print("File not found.")

우아한 오류 처리 구현

FileNotFoundErrorIOError와 같은 다른 잠재적 예외를 처리하기 위해 항상 파일 작업을 try-except 블록으로 묶습니다. 이렇게 하면 프로그램이 충돌하는 것을 방지하고 유익한 피드백이나 대체 작업을 제공할 수 있습니다.

대체 옵션 제공

파일을 찾을 수 없는 경우 기본 데이터를 사용하거나 기본 내용으로 새 파일을 만드는 것과 같은 대체 옵션을 고려하십시오. 이렇게 하면 프로그램이 원활하게 계속 작동하는 데 도움이 됩니다.

절대 경로 사용 (적절한 경우)

상대 경로는 간단한 스크립트에 편리하지만, 절대 경로를 사용하면 특히 다른 디렉토리의 파일을 처리하거나 스크립트의 작업 디렉토리가 변경될 수 있는 경우 코드를 더 강력하게 만들 수 있습니다.

os.path.abspath()를 사용하여 파일의 절대 경로를 얻을 수 있습니다.

import os

relative_path = "my_file.txt"
absolute_path = os.path.abspath(relative_path)
print(f"Absolute path: {absolute_path}")

터미널에서 이것을 시도해 보겠습니다. Python 인터프리터를 엽니다.

python

인터프리터 내에서 다음을 입력합니다.

import os
print(os.path.abspath("my_file.txt"))

프로젝트 디렉토리에서 my_file.txt의 절대 경로를 볼 수 있습니다.

/home/labex/project/my_file.txt

exit()를 입력하여 Python 셸을 종료합니다.

exit()

이러한 모범 사례를 통합함으로써 파일 작업을 효과적이고 우아하게 처리하는 더 신뢰할 수 있는 Python 코드를 작성할 수 있습니다.

요약

이 Python 튜토리얼에서는 Python 에서 FileNotFoundError를 효과적으로 처리하는 방법을 배웠습니다. 예외를 포착하기 위해 try-except 블록을 사용하고, 열기 전에 파일 존재 여부를 확인하기 위해 os.path.exists() 함수를 사용하는 방법을 살펴보았습니다. 또한 컨텍스트 관리자 사용, 우아한 오류 처리, 대체 옵션 제공, 절대 경로 고려 등 강력한 파일 처리를 위한 모범 사례를 검토했습니다.

이러한 기술을 적용하여 파일 관련 작업을 효과적으로 처리하고 더 나은 사용자 경험을 제공할 수 있는 더 안정적이고 탄력적인 Python 코드를 작성할 수 있습니다.