pathlib — 객체 지향 파일 시스템 경로

pathlib — 객체 지향 파일 시스템 경로

pathlib 모듈은 서로 다른 운영체제에 적합한 의미를 가진 파일 시스템 경로를 나타내는 클래스들을 제공해요. 경로 클래스는 I/O 없이 순수 계산 연산만 제공하는 순수 경로(pure path)와, 순수 경로를 상속하면서 I/O 연산도 제공하는 구체 경로(concrete path)로 나뉘어요. 버전 3.4에서 추가됐어요.

출처: Python documentation

본문

PEP 428에서 소개된 모듈이에요. 문자열 기반의 저수준 경로 조작은 os.path 모듈로도 할 수 있어요.

상속 구조는 가장 기본인 PurePathPurePosixPath, PureWindowsPath, Path 의 세 직계 하위 클래스를 갖고, 다중 상속으로 PosixPath(PurePosixPath + Path)와 WindowsPath(PureWindowsPath + Path)가 있어요.

이 모듈을 처음 쓰거나 어떤 클래스가 맞는지 모르겠다면 Path 가 가장 적합해요. 코드가 실행되는 플랫폼의 구체 경로를 만들어 줘요.

순수 경로는 특수한 경우에 유용해요. 예를 들면:

  1. Unix 머신에서 Windows 경로를 조작하고 싶을 때(또는 반대). Unix에서 WindowsPath 는 인스턴스화할 수 없지만 PureWindowsPath 는 할 수 있어요.
  2. 코드가 실제로 OS에 접근하지 않고 경로만 조작하도록 보장하고 싶을 때.

기본 사용 (Basic use)

>>> from pathlib import Path

하위 디렉터리 나열하기:

>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
 PosixPath('__pycache__'), PosixPath('build')]

디렉터리 트리 안의 파이썬 소스 파일 나열하기:

>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
 PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
 PosixPath('build/lib/pathlib.py')]

디렉터리 트리 안 탐색:

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

경로 속성 조회:

>>> q.exists()
True
>>> q.is_dir()
False

파일 열기:

>>> with q.open() as f: f.readline()
...
'#!/bin/bash\n'

예외 (Exceptions)

  • exception pathlib.UnsupportedOperation — 경로 객체에서 지원되지 않는 연산을 호출할 때 발생하는 NotImplementedError 를 상속한 예외예요. 버전 3.13에서 추가됐어요.

순수 경로 (Pure paths)

순수 경로 객체는 실제로 파일 시스템에 접근하지 않는 경로 처리 연산을 제공해요.

  • *class pathlib.PurePath(pathsegments) — 시스템의 경호 flavor 를 나타내는 일반 클래스예요(인스턴스화하면 PurePosixPath 또는 PureWindowsPath 를 만듦).
  • *class pathlib.PurePosixPath(pathsegments)PurePath 의 하위 클래스로 비-Windows 파일 시스템 경로를 나타내요.
  • *class pathlib.PureWindowsPath(pathsegments) — Windows 파일 시스템 경로(UNC 경로 포함)를 나타내요.

순수 경로는 시스템 호출을 하는 연산을 제공하지 않으므로 실행 중인 시스템과 관계없이 모두 인스턴스화할 수 있어요.

일반 속성 (General properties)

경로는 불변(immutable)이고 해시 가능(hashable)해요. 같은 flavor 의 경로는 비교·정렬할 수 있어요. flavor 의 대소문자 접기 의미를 따르므로 PurePosixPath('foo') == PurePosixPath('FOO')False 지만, PureWindowsPath('foo') == PureWindowsPath('FOO')True 예요. 서로 다른 flavor 의 경로는 같지 않고 정렬할 수 없어요.

연산자 (Operators)

슬래시 연산자는 os.path.join() 처럼 하위 경로를 만들 때 도와줘요. 인자가 절대 경로면 이전 경로는 무시돼요. Windows에서는 인자가 루트 상대 경로(예: r'\foo')여도 드라이브는 리셋되지 않아요.

개별 부분 접근 (Accessing individual parts)

  • PurePath.parts — 경로의 다양한 구성 요소에 접근하는 튜플이에요. PurePath('/usr/bin/python3').parts('/', 'usr', 'bin', 'python3') 이에요.

패턴 언어 (Pattern language)

full_match(), glob(), rglob() 의 패턴에서 다음 와일드카드를 지원해요.

  • ** (전체 세그먼트) — 파일이나 디렉터리 세그먼트 0개 이상과 일치.
  • * (전체 세그먼트) — 파일이나 디렉터리 세그먼트 하나와 일치.
  • * (세그먼트 일부) — 구분자가 아닌 문자 0개 이상과 일치.
  • ? — 구분자가 아닌 문자 하나와 일치.
  • [seq]seq 에 있는 문자 하나와 일치. 범위 표현 지원(예: [a-z]).
  • [!seq]seq 에 없는 문자 하나와 일치.

** 와일드카드는 재귀적 globbing 을 가능하게 해요. 예: **/* 는 세그먼트가 하나 이상인 모든 경로, **/*.py 는 마지막 세그먼트가 .py 로 끝나는 모든 경로와 일치해요.

파일·디렉터리 연산 (File and directory operations)

  • Path.move(target) — 이 파일 또는 디렉터리 트리를 target 으로 옮기고 target 을 가리키는 새 Path 를 반환해요. target 이 없으면 만들어요. 두 경로가 같은 파일 시스템이면 os.replace() 로 옮기고, 아니면 메타데이터·심볼릭 링크를 보존하며 복사한 뒤 삭제해요. (버전 3.14 추가)
  • Path.unlink(missing_ok=False) — 이 파일 또는 심볼릭 링크를 제거해요. missing_ok 가 false(기본)면 경로가 없을 때 FileNotFoundError 가 발생하고, true 면 무시해요(POSIX rm -f 와 같은 동작).
  • Path.rmdir() — 이 디렉터리를 제거해요. 디렉터리는 비어 있어야 해요.

더 알아보기 (Learn more)