pathlib — 객체 지향 파일 시스템 경로
pathlib — 객체 지향 파일 시스템 경로
pathlib 모듈은 서로 다른 운영체제에 적합한 의미를 가진 파일 시스템 경로를 나타내는 클래스들을 제공해요. 경로 클래스는 I/O 없이 순수 계산 연산만 제공하는 순수 경로(pure path)와, 순수 경로를 상속하면서 I/O 연산도 제공하는 구체 경로(concrete path)로 나뉘어요. 버전 3.4에서 추가됐어요.
본문
PEP 428에서 소개된 모듈이에요. 문자열 기반의 저수준 경로 조작은 os.path 모듈로도 할 수 있어요.
상속 구조는 가장 기본인 PurePath 가 PurePosixPath, PureWindowsPath, Path 의 세 직계 하위 클래스를 갖고, 다중 상속으로 PosixPath(PurePosixPath + Path)와 WindowsPath(PureWindowsPath + Path)가 있어요.
이 모듈을 처음 쓰거나 어떤 클래스가 맞는지 모르겠다면 Path 가 가장 적합해요. 코드가 실행되는 플랫폼의 구체 경로를 만들어 줘요.
순수 경로는 특수한 경우에 유용해요. 예를 들면:
- Unix 머신에서 Windows 경로를 조작하고 싶을 때(또는 반대). Unix에서
WindowsPath는 인스턴스화할 수 없지만PureWindowsPath는 할 수 있어요. - 코드가 실제로 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 면 무시해요(POSIXrm -f와 같은 동작). - Path.rmdir() — 이 디렉터리를 제거해요. 디렉터리는 비어 있어야 해요.