파일 탐색기에는 파일이 보이는데 Python 자동화에서 FileNotFoundError가 난다면 먼저 Path.cwd()와 resolve()로 실제 경로를 확인하고, exists()로 파일을 확인한 뒤 실행 기준을 선택합니다.
파일 탐색기에는 파일이 보이는데 Python 자동화에서 FileNotFoundError가 난다면 먼저 Path.cwd()와 resolve()로 Python이 실제로 찾는 위치를 출력하고, exists()로 파일을 확인한 뒤 실행 위치에 따라 달라져도 되는 경로인지 스크립트 기준으로 고정해야 하는지 결정합니다.
먼저 실제로 찾는 경로를 출력합니다
FileNotFoundError는 요청한 파일이나 디렉터리가 존재하지 않을 때 발생합니다. 다만 코드에 적은 input/data.csv가 어느 폴더의 input/data.csv인지 모르면 파일명만 고쳐서는 원인을 찾기 어렵습니다.
FileNotFoundError는 요청한 파일이나 디렉터리가 존재하지 않을 때 발생하므로, 열기 전에 exists()로 확인하면 진단 메시지를 구체화할 수 있습니다.
from pathlib import Path
relative_path = Path("input/data.csv")
print("현재 작업 폴더:", Path.cwd())
print("Python이 찾는 경로:", relative_path.resolve())
print("파일 존재 여부:", relative_path.exists())
Path.cwd()를 출력하면 상대경로가 현재 실행에서 어느 폴더를 기준으로 해석되는지 확인할 수 있습니다. Path.resolve()는 경로를 절대 경로로 해석합니다. 출력된 경로가 파일이 있는 폴더와 다르면 상대경로의 기준이 문제입니다. 같은 경로가 나오는데도 exists()가 False라면 파일명, 확장자, 대소문자 또는 실제 파일 위치를 다시 확인합니다.
CWD 기준과 스크립트 기준을 구분합니다
터미널에서 특정 프로젝트 폴더로 이동한 뒤 한 번 실행하는 작업이라면 CWD 기준 상대경로가 자연스러울 수 있습니다. 반면 예약 실행이나 다른 폴더에서 실행될 수 있는 자동화라면 스크립트 파일을 기준으로 경로를 정하는 편이 예측하기 쉽습니다.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
input_path = BASE_DIR / "input" / "data.csv"
if not input_path.exists():
raise FileNotFoundError(f"입력 파일을 찾지 못했습니다: {input_path}")
text = input_path.read_text()
print(text)
스크립트 파일을 기준으로 삼을 때는 Path(__file__).resolve().parent에서 기준 경로를 만들고 입력 파일을 결합합니다. 이 코드는 실행을 어디에서 시작했는지와 관계없이 __file__이 가리키는 스크립트 위치에서 input/data.csv를 찾습니다. 입력 파일이 프로젝트 바깥에 있을 때는 프로젝트 기준으로 억지로 고정하지 말고, 설정값이나 환경변수로 경로를 받아 resolve()와 exists()로 확인하는 방식이 맞습니다.
오류가 나면 이 순서로 점검합니다
먼저 Path.cwd()를 출력해 실행 기준 폴더를 확인합니다. 다음으로 상대경로에 resolve()를 적용해 Python이 실제로 찾는 절대경로를 확인합니다. 이어서 exists() 결과와 파일명·확장자를 확인하고, 실행 위치가 바뀌어도 같은 파일이어야 한다면 Path(__file__).resolve().parent 기준으로 경로를 구성합니다.
상대경로를 무조건 절대경로 문자열로 바꾸는 것이 답은 아닙니다. 작업자가 선택한 폴더가 입력 위치인 프로그램이면 CWD를 명시적으로 정하고, 코드와 함께 배포하는 자동화 파일이면 스크립트 기준이나 설정으로 입력 위치를 분리하세요. 파일을 절대경로로 무작정 바꾸기 전에 실행 기준과 스크립트 기준 중 어느 쪽이 맞는지 판단하게 합니다. 일회성 터미널 작업은 CWD 기준을 유지할 수 있지만 자동화·예약 실행은 스크립트 기준 경로가 더 안정적일 수 있습니다. 실제로 해석된 경로를 출력하면 파일명 오타와 실행 위치 문제를 구분할 수 있습니다. 다음에는 작업 스케줄러에서 실행 폴더가 달라지는 조건을 별도로 확인할 수 있습니다.