Python 강좌 / pathlib로 파일·폴더 경로 다루기

pathlib의 Path는 파일·폴더 경로를 운영체제에 맞게 조합하고 확인하는 객체입니다. 상대경로는 현재 작업 폴더를 기준으로 해석되므로 실행 위치와 소스 파일 위치를 구분해야 합니다.

문자열 연결 대신 경로 연산 사용하기

Path("data") / "expenses.csv"처럼 / 연산자로 경로를 연결합니다. Windows의 역슬래시를 수동으로 넣거나 운영체제별 구분자를 조건문으로 나눌 필요가 줄어듭니다. 경로 객체를 만드는 것만으로 파일이 생성되지는 않습니다.

관련 동작과 지원 조건은 pathlib로 파일·폴더 경로 다루기 관련 공식 문서에서 확인할 수 있습니다.

Path.cwd()는 현재 작업 폴더입니다. 스크립트가 있는 폴더가 필요하면 Path(__file__).resolve().parent를 사용할 수 있으나 대화형 환경에서는 __file__이 없을 수 있습니다. 어떤 위치를 기준으로 쓸지 프로그램의 인터페이스에서 정합니다.

전체 예제와 실행 결과

별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python paths.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.

paths.py 파일의 전체 내용입니다.

from pathlib import Path

base = Path("lab-data")
base.mkdir(exist_ok=True)
path = base / "expenses.csv"
path.write_text("name,amount\nlunch,8000\n", encoding="utf-8")
print(path.name, path.suffix, path.stem)
print(path.is_file(), base.is_dir())
print(sorted(p.name for p in base.glob("*.csv")))

예상 결과는 다음과 같습니다.

expenses.csv .csv expenses
True True
['expenses.csv']

파일 검색과 존재 확인의 한계

glob("*.csv")는 지정 폴더의 일치 항목을 찾고 rglob("*.csv")는 하위 폴더까지 찾습니다. 파일과 디렉터리가 함께 나올 수 있으므로 필요하면 is_file()로 좁힙니다. 검색 순서는 보장에 의존하지 말고 정렬해 결과를 일정하게 만듭니다.

exists로 검사한 다음 실제 작업 사이에 파일이 바뀔 수 있습니다. 존재 확인은 안내에 유용하지만 접근 권한, 경합, 디스크 오류까지 없애지 않습니다. 중요한 쓰기에서는 예외 처리와 덮어쓰기 정책을 함께 설계합니다.

실행 위치를 바꾸어 비교하기

위 예제는 현재 작업 폴더 아래 lab-data에 파일을 만듭니다. 같은 코드를 다른 폴더에서 실행하면 다른 lab-data가 만들어집니다. 이것이 잘못된 동작인지 의도한 동작인지는 프로그램의 경로 계약에 따라 달라집니다.

  1. 만들어진 파일의 내용을 열어 이름과 금액 두 줄을 확인합니다.
  2. 파일명만 다른 이름으로 바꿔 name·stem·suffix의 차이를 확인합니다.
  3. 실습 폴더 정리 시 실제 절대 경로를 확인한 뒤 방금 만든 파일만 지웁니다.

외부 입력을 경로로 사용할 때는 ../ 같은 이동, 절대경로, 심볼릭 링크까지 고려해야 합니다. 단순히 문자열 앞부분이 같다는 검사만으로 허용 폴더 안에 있다고 판단하지 않습니다.