Python 오류 해결: Python FileNotFoundError 해결하기
저도 처음에 PATH에서 막혔던 것처럼, FileNotFoundError 앞에서도 한참을 멍하니 있었던 기억이 있습니다. 분명 파일 탐색기에는 그 파일이 버젓이 존재하는데, VS Code에서 코드를 실행하면 계속 "그런 파일이나 디렉터리가 없다"는 오류만 뱉어내니 정말 당황스러웠습니다. 파일 이름을 몇 번이고 다시 확인해봐도 오타는 없었는데, 알고 보니 문제는 파일 이름이 아니라 코드가 실행되는 위치, 즉 작업 디렉터리가 제가 생각했던 곳과 전혀 다른 곳이었다는 사실이었습니다. 이번 글에서는 그때 겪었던 경험을 바탕으로, VS Code에서 Python을 사용할 때 자주 마주치는 FileNotFoundError의 원인과 해결 방법을 정리해보겠습니다.
FileNotFoundError가 발생하는 근본 원인
작업 디렉터리라는 개념 이해하기
Python에서 open('sample.txt')처럼 파일 경로를 상대 경로로 작성하면, 이 경로는 파일이 저장된 위치를 기준으로 하는 것이 아니라 코드가 실행되는 시점의 작업 디렉터리(Working Directory)를 기준으로 해석됩니다. 이 개념을 정확히 이해하지 못하면 파일이 분명히 존재하는데도 계속 찾지 못하는 상황에 빠지게 됩니다.
비유하자면 상대 경로는 마치 "우리 집에서 두 블록 떨어진 편의점"이라는 설명과 같습니다. 이 설명은 내가 지금 정확히 우리 집에 서 있을 때만 유효하며, 만약 다른 동네에서 출발한다면 전혀 엉뚱한 곳을 찾아 헤매게 됩니다. Python 코드도 마찬가지로, 지금 어느 위치를 기준으로 실행되고 있는지 모르면 상대 경로가 엉뚱한 곳을 가리키게 됩니다.
FileNotFoundError가 발생하는 대표적인 상황
- 코드 실행 위치와 파일이 실제로 있는 위치가 다른 경우
- 파일 이름이나 확장자를 잘못 입력한 경우
- 파일 이름에 대소문자를 다르게 입력한 경우
- 폴더 경로 구분자를 운영체제와 맞지 않게 작성한 경우
- 파일이 실제로 아직 생성되지 않았거나 삭제된 경우
VS Code에서 작업 디렉터리 확인하고 해결하기
현재 작업 디렉터리 확인하기
가장 먼저 해야 할 일은 지금 코드가 어느 위치를 기준으로 실행되고 있는지 직접 눈으로 확인하는 것입니다. os 모듈을 활용하면 현재 작업 디렉터리를 손쉽게 출력해볼 수 있습니다.
import os
print(os.getcwd())
이 코드를 실행했을 때 나오는 경로가 여러분이 생각했던 파일 위치와 다르다면, 바로 그 지점이 오류의 원인입니다.
VS Code의 실행 기준 위치 이해하기
VS Code는 기본적으로 현재 열려 있는 폴더(작업 공간)를 기준으로 코드를 실행하는 경우가 많지만, 실행 방식(디버그 실행, 터미널 직접 실행 등)에 따라 기준 위치가 달라질 수 있습니다. 특히 여러 개의 하위 폴더로 구성된 프로젝트에서는 스크립트 파일이 있는 폴더와 VS Code가 열어놓은 최상위 폴더가 다를 수 있어 혼란이 생기기 쉽습니다.
절대 경로와 상대 경로로 문제 해결하기
절대 경로를 직접 지정하기
가장 확실한 해결 방법은 파일의 전체 경로, 즉 절대 경로를 직접 지정해주는 것입니다. 작업 디렉터리가 어디든 상관없이 항상 정확한 위치를 가리키기 때문에 오류가 발생할 여지가 없습니다.
with open(r'C:\Users\사용자명\Documents\project\sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
다만 이 방식은 다른 컴퓨터로 코드를 옮기면 경로가 깨진다는 단점이 있으므로, 협업하거나 배포할 코드에는 적합하지 않습니다.
스크립트 파일 기준으로 경로 잡기
작업 디렉터리에 의존하지 않고, 코드 파일 자신의 위치를 기준으로 경로를 계산하는 방법이 훨씬 안정적입니다. __file__ 변수를 활용하면 현재 실행 중인 스크립트 파일의 경로를 알아낼 수 있습니다.
import os
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, 'sample.txt')
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
print(content)
이렇게 작성하면 스크립트를 어느 위치에서 실행하든, 항상 스크립트 파일과 같은 폴더에 있는 sample.txt를 정확하게 찾아갑니다.
pathlib으로 더 안전하게 경로 다루기
최근에는 문자열로 경로를 조합하는 대신 pathlib 모듈을 사용하는 방식이 더 권장되는데, 운영체제마다 다른 경로 구분자 문제를 자동으로 처리해주기 때문입니다.
from pathlib import Path
script_dir = Path(__file__).parent
file_path = script_dir / 'sample.txt'
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
print(content)
파일 존재 여부 미리 확인하기
예외 처리로 안정성 높이기
파일이 실제로 존재하지 않을 가능성이 있는 상황이라면, 오류가 발생하기 전에 미리 파일 존재 여부를 확인하거나 예외 처리를 통해 프로그램이 갑자기 멈추지 않도록 만드는 것이 좋습니다.
from pathlib import Path
file_path = Path('sample.txt')
if file_path.exists():
with open(file_path, 'r', encoding='utf-8') as f:
print(f.read())
else:
print("파일을 찾을 수 없습니다. 경로를 다시 확인해주세요.")
try-except 구문을 활용하면 다음과 같이 더 명시적으로 오류를 처리할 수도 있습니다.
try:
with open('sample.txt', 'r', encoding='utf-8') as f:
print(f.read())
except FileNotFoundError:
print("해당 경로에 파일이 존재하지 않습니다.")
마무리
지금까지 VS Code에서 Python을 사용할 때 발생하는 FileNotFoundError의 원인과 해결 방법을 정리해봤습니다. 이 오류는 코드 자체의 문법 문제가 아니라 경로 인식 방식의 차이에서 비롯되는 경우가 대부분이므로, 작업 디렉터리 개념만 정확히 이해하면 앞으로는 훨씬 수월하게 대처할 수 있습니다.
핵심 내용을 정리하면 다음과 같습니다.
- FileNotFoundError는 대부분 파일이 없어서가 아니라 경로 인식 방식의 차이 때문에 발생합니다
os.getcwd()로 현재 작업 디렉터리를 먼저 확인하는 것이 문제 해결의 출발점입니다- 절대 경로는 확실하지만 다른 컴퓨터에서는 깨질 수 있어 주의가 필요합니다
__file__과pathlib을 활용하면 어느 위치에서 실행하든 안정적으로 경로를 찾을 수 있습니다- 예외 처리와 파일 존재 여부 확인을 통해 프로그램이 갑작스럽게 멈추는 것을 방지할 수 있습니다
다음 글에서는 Python에서 파일을 다룰 때 함께 자주 발생하는 PermissionError와 같은 관련 오류들을 더 자세히 다뤄보도록 하겠습니다.
댓글
댓글 쓰기