Python

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

Added in version 3.4.

소스 코드: Lib/pathlib/


이 모듈은 다른 운영 체제에 적합한 의미 체계를 가진 파일 시스템 경로를 나타내는 클래스를 제공합니다. 경로 클래스는 I/O 없이 순수한 계산 연산을 제공하는 순수한 경로와 순수한 경로를 상속하지만, I/O 연산도 제공하는 구상 경로로 구분됩니다.

Inheritance diagram showing the classes available in pathlib. The most basic class is PurePath, which has three direct subclasses: PurePosixPath, PureWindowsPath, and Path. Further to these four classes, there are two classes that use multiple inheritance: PosixPath subclasses PurePosixPath and Path, and WindowsPath subclasses PureWindowsPath and Path.

이전에 이 모듈을 사용한 적이 없거나 어떤 클래스가 작업에 적합한지 확신이 없다면, Path가 가장 적합할 가능성이 높습니다. 코드가 실행되는 플랫폼의 구상 경로를 인스턴스화 합니다.

순수한 경로는 특별한 경우에 유용합니다; 예를 들면:

  1. 유닉스 기계에서 윈도우 경로를 조작하려고 할 때 (또는 그 반대). 유닉스에서 실행할 때는 WindowsPath를 인스턴스화 할 수 없지만, PureWindowsPath는 인스턴스화 할 수 있습니다.

  2. 코드가 실제로 OS에 액세스하지 않고 경로만 조작한다는 확신이 필요할 때. 이 경우, 순수 클래스 중 하나를 인스턴스화 하면 OS 액세스 연산이 없어서 유용 할 수 있습니다.

더 보기

PEP 428: pathlib 모듈 – 객체 지향 파일 시스템 경로.

더 보기

문자열에 대한 저수준 경로 조작을 위해, os.path 모듈을 사용할 수도 있습니다.

기본 사용

메인 클래스 임포트 하기:

>>> 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'

예외 처리

exception pathlib.UnsupportedOperation

경로 객체에서 지원되지 않는 연산을 호출할 때 발생하는 NotImplementedError 를 상속받은 예외입니다.

Added in version 3.13.

순수한 경로

순수한 경로 객체는 실제로 파일 시스템에 액세스하지 않는 경로 처리 연산을 제공합니다. 이 클래스에 액세스하는 방법에는 세 가지가 있으며, 플레이버(flavours)라고도 부릅니다:

class pathlib.PurePath(*pathsegments)

시스템의 경로 플레이버를 나타내는 일반 클래스 (인스턴스화 하면 PurePosixPathPureWindowsPath를 만듭니다):

>>> PurePath('setup.py')      # Unix 머신에서 실행
PurePosixPath('setup.py')

pathsegments 의 각 요소는 경로 세그먼트를 나타내는 문자열이거나, __fspath__() 메서드가 문자열을 반환하는 os.PathLike 인터페이스를 구현하는 객체(예: 다른 경로 객체)일 수 있습니다:

>>> PurePath('foo', 'some/path', 'bar')
PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
PurePosixPath('foo/bar')

pathsegments가 비어 있으면, 현재 디렉터리를 가정합니다:

>>> PurePath()
PurePosixPath('.')

세그먼트가 절대 경로인 경우, 이전의 모든 세그먼트는 무시됩니다(os.path.join() 과 유사하게):

>>> PurePath('/etc', '/usr', 'lib64')
PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')

Windows에서 루트 상대 경로 세그먼트(예: r'\foo')를 발견할 때 드라이브가 재설정되지 않습니다:

>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')

불필요한 슬래시와 단일 점은 병합되지만, 이중점('..')과 선행 이중 슬래시('//')는 여러 이유(예: 심볼릭 링크, UNC 경로)로 인해 경로의 의미를 변경할 수 있으므로 그대로 유지됩니다:

>>> PurePath('foo//bar')
PurePosixPath('foo/bar')
>>> PurePath('//foo/bar')
PurePosixPath('//foo/bar')
>>> PurePath('foo/./bar')
PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
PurePosixPath('foo/../bar')

(나이브한 접근법은 PurePosixPath('foo/../bar')PurePosixPath('bar')와 동등하게 만드는데, foo가 다른 디렉터리에 대한 심볼릭 링크일 때는 잘못됩니다)

순수한 경로 객체는 os.PathLike 인터페이스를 구현하여, 이 인터페이스가 허용되는 모든 위치에서 사용할 수 있습니다.

버전 3.6에서 변경: os.PathLike 인터페이스에 대한 지원이 추가되었습니다.

class pathlib.PurePosixPath(*pathsegments)

PurePath의 서브 클래스, 이 경로 플레이버는 윈도우 이외의 파일 시스템 경로를 나타냅니다:

>>> PurePosixPath('/etc/hosts')
PurePosixPath('/etc/hosts')

pathsegmentsPurePath와 유사하게 지정됩니다.

class pathlib.PureWindowsPath(*pathsegments)

PurePath 의 하위 클래스로서 이 경로 플레이버는 UNC paths 를 포함한 Windows 파일 시스템 경로를 나타냅니다:

>>> PureWindowsPath('c:/', 'Users', 'Ximénez')
PureWindowsPath('c:/Users/Ximénez')
>>> PureWindowsPath('//server/share/file')
PureWindowsPath('//server/share/file')

pathsegmentsPurePath와 유사하게 지정됩니다.

실행 중인 시스템과 관계없이, 이러한 모든 클래스를 인스턴스화 할 수 있는데, 시스템 호출을 수행하는 연산을 제공하지 않기 때문입니다.

일반 속성

경로(Paths)는 불변하며 hashable 합니다. 동일한 플레이버의 경로들은 비교 가능하고 순서 지정이 가능합니다. 이러한 속성들은 해당 플레이버의 케이스 폴딩 의미론을 준수합니다:

>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True

다른 플레이버의 경로는 다르다고 비교되며 대소 비교할 수 없습니다:

>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'

연산자

슬래시 연산자는 os.path.join`과 같이 자식 경로를 생성하는 도움을 줍니다. 인자가 절대 경로인 경우 이전 경로는 무시됩니다. Windows에서 인자가 루트 상대 경로(예를 들어 ``r'foo'`())인 경우 드라이브는 재설정되지 않습니다.

>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> p / '/an_absolute_path'
PurePosixPath('/an_absolute_path')
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')

경로 객체는 os.PathLike을 구현하는 객체가 허용되는 모든 곳에서 사용할 수 있습니다:

>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'

경로의 문자열 표현은 원시 파일 시스템 경로 자체(네이티브 형식으로, 예를 들어 윈도우에서 역 슬래시)로, 파일 경로를 문자열로 받아들이는 모든 함수에 전달할 수 있습니다:

>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'

마찬가지로, 경로에 대해 bytes를 호출하면 os.fsencode()로 인코딩된 바이트열 객체로 원시 파일 시스템 경로를 제공합니다:

>>> bytes(p)
b'/etc'

참고

bytes 호출은 유닉스에서만 권장됩니다. 윈도우에서, 유니코드 형식이 파일 시스템 경로의 규범적(canonical) 표현입니다.

개별 부분에 액세스하기

경로의 개별 “부분”(구성 요소)에 액세스하려면, 다음 프로퍼티를 사용하십시오:

PurePath.parts

경로의 다양한 구성 요소로의 액세스를 제공하는 튜플:

>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')

>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')

(드라이브와 로컬 루트가 단일 부분으로 다시 그룹화되는 방식에 유의하십시오)

메서드와 프로퍼티

순수한 경로는 다음과 같은 메서드와 프로퍼티를 제공합니다:

PurePath.parser

저수준 경로 파싱 및 결합에 사용되는 os.path 모듈의 구현체는 posixpath 또는 ntpath 중 하나입니다.

Added in version 3.13.

PurePath.drive

드라이브 문자나 이름을 나타내는 문자열, 있다면:

>>> PureWindowsPath('c:/Program Files/').drive
'c:'
>>> PureWindowsPath('/Program Files/').drive
''
>>> PurePosixPath('/etc').drive
''

UNC 공유도 드라이브로 간주합니다:

>>> PureWindowsPath('//host/share/foo.txt').drive
'\\\\host\\share'
PurePath.root

(로컬이나 글로벌) 루트를 나타내는 문자열, 있다면:

>>> PureWindowsPath('c:/Program Files/').root
'\\'
>>> PureWindowsPath('c:Program Files/').root
''
>>> PurePosixPath('/etc').root
'/'

UNC 공유에는 항상 루트가 있습니다:

>>> PureWindowsPath('//host/share').root
'\\'

경로가 두 개 이상의 연속된 슬래시로 시작하면, PurePosixPath 는 이를 하나로 합칩니다.

>>> PurePosixPath('//etc').root
'//'
>>> PurePosixPath('///etc').root
'/'
>>> PurePosixPath('////etc').root
'/'

참고

이 동작은 The Open Group Base Specifications Issue 64.11 Pathname Resolution 단락을 따릅니다.

“두 개의 연속된 슬래시로 시작하는 경로명은 구현에 따라 정의된 방식으로 해석될 수 있지만, 두 개 이상의 선행 슬래시는 단일 슬래시로 취급됩니다.”

PurePath.anchor

드라이브와 루트의 이어 붙이기:

>>> PureWindowsPath('c:/Program Files/').anchor
'c:\\'
>>> PureWindowsPath('c:Program Files/').anchor
'c:'
>>> PurePosixPath('/etc').anchor
'/'
>>> PureWindowsPath('//host/share').anchor
'\\\\host\\share\\'
PurePath.parents

경로의 논리적 조상에 대한 액세스를 제공하는 불변 시퀀스:

>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
PureWindowsPath('c:/foo')
>>> p.parents[2]
PureWindowsPath('c:/')

버전 3.10에서 변경: parents 시퀀스가 이제 슬라이스 및 음수 인덱스 값을 지원합니다.

PurePath.parent

경로의 논리적 부모:

>>> p = PurePosixPath('/a/b/c/d')
>>> p.parent
PurePosixPath('/a/b/c')

앵커나 빈 경로를 넘어갈 수 없습니다:

>>> p = PurePosixPath('/')
>>> p.parent
PurePosixPath('/')
>>> p = PurePosixPath('.')
>>> p.parent
PurePosixPath('.')

참고

이것은 순수한 어휘(lexical) 연산이라서, 다음과 같이 동작합니다:

>>> p = PurePosixPath('foo/..')
>>> p.parent
PurePosixPath('foo')

임의의 파일 시스템 경로를 상위로 거슬러 올라가려면 먼저 Path.resolve`를 호출하여 심볼릭 링크를 해결하고 `()”..”`` 구성 요소를 제거하는 것이 좋습니다.

PurePath.name

드라이브와 루트를 제외하고, 마지막 경로 구성 요소를 나타내는 문자열, 있다면:

>>> PurePosixPath('my/library/setup.py').name
'setup.py'

UNC 드라이브 이름은 고려되지 않습니다:

>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''
PurePath.suffix

마지막 구성 요소에서 마침표로 구분된 마지막 부분(있는 경우에만 해당):

>>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''

이것은 일반적으로 파일 확장자로 불립니다.

버전 3.14에서 변경: 단일 마침표(”.”)도 유효한 접미사로 간주됩니다.

PurePath.suffixes

자주 파일 확장자로 불리는 경로의 접미사 목록입니다:

>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]

버전 3.14에서 변경: 단일 마침표(”.”)도 유효한 접미사로 간주됩니다.

PurePath.stem

suffix가 없는, 마지막 경로 구성 요소:

>>> PurePosixPath('my/library.tar.gz').stem
'library.tar'
>>> PurePosixPath('my/library.tar').stem
'library'
>>> PurePosixPath('my/library').stem
'library'

버전 3.14에서 변경: 단일 마침표(”.”)도 유효한 접미사로 간주됩니다.

PurePath.as_posix()

슬래시(/)가 있는 경로의 문자열 표현을 반환합니다:

>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
PurePath.is_absolute()

경로가 절대적인지 아닌지를 반환합니다. 루트와 (플레이버가 허락하면) 드라이브가 모두 있으면 경로를 절대적이라고 간주합니다:

>>> PurePosixPath('/a/b').is_absolute()
True
>>> PurePosixPath('a/b').is_absolute()
False

>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True
PurePath.is_relative_to(other)

이 경로가 other 경로에 상대적인지를 반환합니다.

>>> p = PurePath('/etc/passwd')
>>> p.is_relative_to('/etc')
True
>>> p.is_relative_to('/usr')
False

이 메서드는 문자열 기반이며, 파일 시스템에 접근하지도 .. 세그먼트를 특별하게 처리하지도 않습니다. 다음 코드가 동일한 역할을 수행합니다:

>>> u = PurePath('/usr')
>>> u == p or u in p.parents
False

Added in version 3.9.

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.14에서 제거됨: 추가 인자를 전달하는 것은 더 이상 권장되지 않습니다(deprecated). 제공된 경우, 해당 인자들은 other 와 결합됩니다.

PurePath.joinpath(*pathsegments)

이 메서드를 호출하는 것은 경로를 주어진 각 pathsegments 와 차례대로 결합하는 것과 같습니다:

>>> PurePosixPath('/etc').joinpath('passwd')
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
PurePosixPath('/etc/passwd')
>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
PurePosixPath('/etc/init.d/apache2')
>>> PureWindowsPath('c:').joinpath('/Program Files')
PureWindowsPath('c:/Program Files')
PurePath.full_match(pattern, *, case_sensitive=None)

이 경로를 제공된 glob 스타일 패턴과 비교합니다. 일치하면 True 를, 그렇지 않으면 False 를 반환합니다. 예를 들어:

>>> PurePath('a/b.py').full_match('a/*.py')
True
>>> PurePath('a/b.py').full_match('*.py')
False
>>> PurePath('/a/b/c.py').full_match('/a/**')
True
>>> PurePath('/a/b/c.py').full_match('**/*.py')
True

더 보기

패턴 언어 설명서.

다른 메서드와 마찬가지로, 대소 문자를 구분할지는 플랫폼 기본값을 따릅니다:

>>> PurePosixPath('b.py').full_match('*.PY')
False
>>> PureWindowsPath('b.py').full_match('*.PY')
True

이 동작을 변경하려면 case_sensitiveTrue 또는 False 로 설정하십시오.

Added in version 3.13.

PurePath.match(pattern, *, case_sensitive=None)

이 경로를 제공된 비재귀적(non-recursive) glob 스타일 패턴과 비교합니다. 일치하면 True 를, 그렇지 않으면 False 를 반환합니다.

이 메서드는 full_match() 과 유사하지만, 빈 패턴은 허용되지 않으며(ValueError 발생), 재귀적 와일드카드 “** “는 지원되지 않고(비재귀적인 “* “처럼 작동함), 상대 경로 패턴이 제공되는 경우 오른쪽부터 일치 여부를 확인합니다:

>>> PurePath('a/b.py').match('*.py')
True
>>> PurePath('/a/b/c.py').match('b/*.py')
True
>>> PurePath('/a/b/c.py').match('a/*.py')
False

버전 3.12에서 변경: pattern 매개변수는 경로류 객체 를 수용합니다.

버전 3.12에서 변경: case_sensitive 매개변수가 추가되었습니다.

PurePath.relative_to(other, walk_up=False)

other 가 나타내는 경로에 대한 이 경로의 상대적 버전을 계산합니다. 계산이 불가능한 경우 ValueError 가 발생합니다:

>>> p = PurePosixPath('/etc/passwd')
>>> p.relative_to('/')
PurePosixPath('etc/passwd')
>>> p.relative_to('/etc')
PurePosixPath('passwd')
>>> p.relative_to('/usr')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.

walk_up 이 False일 때(기본값), 경로는 other 로 시작해야 합니다. 이 인자가 True이면 상대 경로를 형성하기 위해 .. 항목이 추가될 수 있습니다. 서로 다른 드라이브를 참조하는 경우 등 다른 모든 상황에서는 ValueError 가 발생합니다:

>>> p.relative_to('/usr', walk_up=True)
PurePosixPath('../etc/passwd')
>>> p.relative_to('foo', walk_up=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 941, in relative_to
    raise ValueError(error_message.format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.

경고

이 함수는 PurePath 의 일부이며 문자열과 함께 작동합니다. 하위 파일 구조를 확인하거나 액세스하지 않습니다. 이 기능은 경로에 심볼릭 링크가 없다고 가정하므로 walk_up 옵션에 영향을 줄 수 있습니다. 필요한 경우 심볼릭 링크를 해결하기 위해 먼저 resolve() 를 호출하십시오.

버전 3.12에서 변경: walk_up 매개변수가 추가되었습니다(이전 동작은 walk_up=False 와 동일합니다).

버전 3.12부터 사용 지원 중단(deprecated), 버전 3.14에서 제거됨: 추가 위치 인자를 전달하는 것은 더 이상 권장되지 않습니다. 제공된 경우, 이들은 other 와 결합됩니다.

PurePath.with_name(name)

name이 변경된 새 경로를 반환합니다. 원래 경로에 이름(name)이 없으면 ValueError가 발생합니다:

>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
PurePath.with_stem(stem)

stem이 변경된 새 경로를 반환합니다. 원래 경로에 이름(name)이 없으면, ValueError가 발생합니다:

>>> p = PureWindowsPath('c:/Downloads/draft.txt')
>>> p.with_stem('final')
PureWindowsPath('c:/Downloads/final.txt')
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_stem('lib')
PureWindowsPath('c:/Downloads/lib.gz')
>>> p = PureWindowsPath('c:/')
>>> p.with_stem('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
    return self.with_name(stem + self.suffix)
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name

Added in version 3.9.

PurePath.with_suffix(suffix)

suffix가 변경된 새 경로를 반환합니다. 원래 경로에 접미사(suffix)가 없으면, 새 suffix가 대신 추가됩니다. suffix가 빈 문자열이면, 원래 접미사가 제거됩니다:

>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')
>>> p = PureWindowsPath('README.txt')
>>> p.with_suffix('')
PureWindowsPath('README')

버전 3.14에서 변경: 단일 마침표(”. “)도 유효한 접미사로 간주됩니다. 이전 버전에서는 단일 마침표가 제공될 경우 ValueError 가 발생했습니다.

PurePath.with_segments(*pathsegments)

주어진 pathsegments 를 결합하여 동일한 유형의 새로운 경로 객체를 생성합니다. 이 메서드는 parentrelative_to() 와 같이 파생된 경로가 생성될 때마다 호출됩니다. 하위 클래스는 다음과 같은 예시와 같이 파생된 경로에 정보를 전달하기 위해 이 메서드를 재정의할 수 있습니다:

from pathlib import PurePosixPath

class MyPath(PurePosixPath):
    def __init__(self, *pathsegments, session_id):
        super().__init__(*pathsegments)
        self.session_id = session_id

    def with_segments(self, *pathsegments):
        return type(self)(*pathsegments, session_id=self.session_id)

etc = MyPath('/etc', session_id=42)
hosts = etc / 'hosts'
print(hosts.session_id)  # 42

Added in version 3.12.

구상 경로

구상 경로는 순수한 경로 클래스의 서브 클래스입니다. 후자가 제공하는 연산 외에도, 경로 객체에 대해 시스템 호출을 수행하는 메서드도 제공합니다. 구상 경로를 인스턴스화 하는 세 가지 방법이 있습니다:

class pathlib.Path(*pathsegments)

PurePath의 서브 클래스, 이 클래스는 시스템의 경로 플레이버의 구상 경로를 나타냅니다 (인스턴스화 하면 PosixPathWindowsPath를 만듭니다):

>>> Path('setup.py')
PosixPath('setup.py')

pathsegmentsPurePath와 유사하게 지정됩니다.

class pathlib.PosixPath(*pathsegments)

PathPurePosixPath의 서브 클래스, 이 클래스는 윈도우 이외의 구상 파일 시스템 경로를 나타냅니다:

>>> PosixPath('/etc/hosts')
PosixPath('/etc/hosts')

pathsegmentsPurePath와 유사하게 지정됩니다.

버전 3.13에서 변경: Windows에서 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 대신 NotImplementedError 가 발생했습니다.

class pathlib.WindowsPath(*pathsegments)

PathPureWindowsPath의 서브 클래스, 이 클래스는 구상 윈도우 파일 시스템 경로를 나타냅니다:

>>> WindowsPath('c:/', 'Users', 'Ximénez')
WindowsPath('c:/Users/Ximénez')

pathsegmentsPurePath와 유사하게 지정됩니다.

버전 3.13에서 변경: Windows 이외의 플랫폼에서 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 대신 NotImplementedError 가 발생했습니다.

여러분의 시스템에 해당하는 클래스 플레이버만 인스턴스화 할 수 있습니다 (호환되지 않는 경로 플레이버에 대한 시스템 호출을 허용하면 응용 프로그램에서 버그나 실패가 발생할 수 있습니다):

>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 798, in __new__
    % (cls.__name__,))
UnsupportedOperation: cannot instantiate 'WindowsPath' on your system

일부 구체적인 경로 메서드는 시스템 호출이 실패할 경우(예를 들어 경로가 존재하지 않는 경우) OSError 를 발생시킬 수 있습니다.

URI 파싱 및 생성

구체적인 경로 객체는 RFC 8089 을 준수하는 ‘file’ URI로부터 생성될 수 있으며, 이를 기반으로 표현될 수도 있습니다.

참고

파일 URI는 서로 다른 파일 시스템 인코딩 을 사용하는 장치 간에 호환되지 않습니다.

classmethod Path.from_uri(uri)

‘file’ URI를 파싱하여 새로운 경로 객체를 반환합니다. 예를 들어:

>>> p = Path.from_uri('file:///etc/hosts')
PosixPath('/etc/hosts')

Windows에서, DOS 장치 및 UNC 경로는 URI로부터 파싱될 수 있습니다:

>>> p = Path.from_uri('file:///c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file://server/share')
WindowsPath('//server/share')

여러 변형된 형식이 지원됩니다:

>>> p = Path.from_uri('file:////server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file://///server/share')
WindowsPath('//server/share')
>>> p = Path.from_uri('file:c:/windows')
WindowsPath('c:/windows')
>>> p = Path.from_uri('file:/c|/windows')
WindowsPath('c:/windows')

ValueError is raised if the URI does not start with file:, or the parsed path isn’t absolute.

Added in version 3.13.

버전 3.14에서 변경: URL 권한이 로컬 호스트 이름과 일치하면 버려집니다. 그렇지 않고 권한이 비어 있거나 localhost 가 아니면, Windows에서는 이전과 동일하게 UNC 경로를 반환하고, 다른 플랫폼에서는 ValueError 가 발생합니다.

Path.as_uri()

경로를 ‘file’ URI로 표현합니다. 경로가 절대 경로가 아닌 경우 ValueError 가 발생합니다.

>>> p = PosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = WindowsPath('c:/Windows')
>>> p.as_uri()
'file:///c:/Windows'

버전 3.14부터 사용 지원 중단(deprecated), 버전 3.19에서 제거 예정: Path 대신 PurePath 에서 이 메서드를 호출하는 것은 가능하지만 권장되지 않습니다(deprecated). 이 메서드가 os.fsencode() 를 사용하기 때문에 엄격하게 불순한(impure) 상태입니다.

경로 확장 및 해결

classmethod Path.home()

사용자의 홈 디렉터리를 나타내는 새 경로 객체를 반환합니다(~ 구문을 포함한 os.path.expanduser() 가 반환하는 것과 동일). 홈 디렉터리를 해결할 수 없는 경우 RuntimeError 가 발생합니다.

>>> Path.home()
PosixPath('/home/antoine')

Added in version 3.5.

Path.expanduser()

Return a new path with expanded ~ and ~user constructs, as returned by os.path.expanduser(). If a home directory can’t be resolved, RuntimeError is raised.

>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')

Added in version 3.5.

classmethod Path.cwd()

현재 디렉터리를 나타내는 새 경로 객체를 반환합니다. os.getcwd()가 반환하는 것과 유사합니다:

>>> Path.cwd()
PosixPath('/home/antoine/pathlib')
Path.absolute()

정규화나 심볼릭 링크 해결 없이 경로를 절대 경로로 만듭니다. 새로운 경로 객체가 반환됩니다:

>>> p = Path('tests')
>>> p
PosixPath('tests')
>>> p.absolute()
PosixPath('/home/antoine/pathlib/tests')
Path.resolve(strict=False)

심볼릭 링크를 결정하여, 경로를 절대적으로 만듭니다. 새로운 경로 객체가 반환됩니다:

>>> p = Path()
>>> p
PosixPath('.')
>>> p.resolve()
PosixPath('/home/antoine/pathlib')

..” 구성 요소도 제거됩니다 (이것이 이렇게 하는 유일한 메서드입니다):

>>> p = Path('docs/../setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')

경로가 존재하지 않거나 심볼릭 링크 루프가 발견되고 strictTrue 인 경우 OSError 가 발생합니다. strictFalse 인 경우, 경로를 가능한 만큼 해결하고 남은 부분을 존재하는지 확인하지 않고 추가합니다.

버전 3.6에서 변경: strict 매개변수가 추가되었습니다(3.6 이전 버전의 동작은 엄격한 방식이었습니다).

버전 3.13에서 변경: 심볼릭 링크 루프는 다른 오류와 동일하게 처리됩니다. 엄격 모드(strict)에서는 OSError 가 발생하고, 비엄격 모드에서는 예외가 발생하지 않습니다. 이전 버전에서는 strict 값에 관계없이 RuntimeError 가 발생했습니다.

심볼릭 링크가 가리키는 경로를 반환합니다 (os.readlink()가 반환하는 것과 유사합니다):

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')

Added in version 3.9.

버전 3.13에서 변경: os.readlink() 을 사용할 수 없는 경우 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 NotImplementedError 가 발생했습니다.

파일 유형 및 상태 조회

버전 3.8에서 변경: exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() now return False instead of raising an exception for paths that contain characters unrepresentable at the OS level.

버전 3.14에서 변경: 앞에 언급된 메서드들은 이제 운영체제로부터 발생하는 어떠한 OSError 예외도 발생시키지 않고 False 를 반환합니다. 이전 버전에서는 일부 종류의 OSError 예외가 발생하고 다른 것들은 억제되었습니다. 새로운 동작은 os.path.exists(), os.path.isdir() 등과 일치합니다. 예외를 억제하지 않고 파일 상태를 확인하려면 stat() 을 사용하십시오.

Path.stat(*, follow_symlinks=True)

os.stat() 과 같이 이 경로에 대한 정보를 포함하는 os.stat_result 객체를 반환합니다. 결과는 이 메서드가 호출될 때마다 조회됩니다.

이 메서드는 기본적으로 심볼릭 링크를 따릅니다. 심볼릭 링크의 상태를 확인하려면 follow_symlinks=False 인자를 추가하거나 lstat() 을 사용하십시오.

>>> p = Path('setup.py')
>>> p.stat().st_size
956
>>> p.stat().st_mtime
1327883547.852554

버전 3.10에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.lstat()

Path.stat()과 비슷하지만, 경로가 심볼릭 링크를 가리키면, 대상이 아닌 심볼릭 링크의 정보를 반환합니다.

Path.exists(*, follow_symlinks=True)

경로가 존재하는 파일이나 디렉터리를 가리키면 True 를 반환합니다. 경로가 유효하지 않거나, 접근할 수 없거나, 누락된 경우 False 를 반환합니다. 이러한 경우를 구분하려면 Path.stat() 을 사용하십시오.

이 메서드는 기본적으로 심볼릭 링크를 따릅니다. 심볼릭 링크의 존재 여부를 확인하려면 follow_symlinks=False 인자를 추가하십시오.

>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False

버전 3.12에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.is_file(*, follow_symlinks=True)

경로가 일반 파일을 가리키면 True 를 반환합니다. 경로가 유효하지 않거나, 접근할 수 없거나, 누락된 경우 또는 일반 파일이 아닌 다른 것을 가리키는 경우 False 를 반환합니다. 이러한 경우를 구분하려면 Path.stat() 을 사용하십시오.

이 메서드는 기본적으로 심볼릭 링크를 따릅니다. 심볼릭 링크를 제외하려면 follow_symlinks=False 인자를 추가하십시오.

버전 3.13에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.is_dir(*, follow_symlinks=True)

경로가 디렉터리를 가리키면 True 를 반환합니다. 경로가 유효하지 않거나, 접근할 수 없거나, 누락된 경우 또는 디렉터리가 아닌 다른 것을 가리키는 경우 False 를 반환합니다. 이러한 경우를 구분하려면 Path.stat() 을 사용하십시오.

이 메서드는 보통 심볼릭 링크를 따라갑니다. 디렉터리로 연결되는 심볼릭 링크를 제외하려면 follow_symlinks=False 인수를 추가하십시오.

버전 3.13에서 변경: follow_symlinks 매개변수가 추가되었습니다.

경로가 심볼릭 링크를 가리키면, 해당 심볼릭 링크가 깨진 경우라도 True 를 반환합니다. 경로가 유효하지 않거나 접근할 수 없거나 누락된 경우, 또는 심볼릭 링크 이외의 대상을 가리키는 경우에는 False 가 반환됩니다. 이러한 경우들을 구분하려면 Path.stat() 을 사용하십시오.

Path.is_junction()

경로가 정션(junction)을 가리키면 True 를 반환하고, 다른 유형의 파일이면 False 를 반환합니다. 현재 윈도우에서만 정션을 지원합니다.

Added in version 3.12.

Path.is_mount()

경로가 다른 파일 시스템이 마운트된 지점인 마운트 포인트`를 가리키면 ``True``를 반환합니다. POSIX에서는 이 함수가 *path*의 상위 디렉터리인 :file:`path/..`가 *path*와 다른 장치에 있는지, 또는 :file:`path/..`와 *path*가 동일한 장치의 동일한 i-node를 가리키는지 확인하며, 이는 모든 Unix 및 POSIX 변형에서 마운트 포인트를 감지할 수 있습니다. 윈도우에서는 마운트 포인트가 드라이브 문자 루트(예: ``c:`), UNC 공유(예: \\server\share) 또는 마운트된 파일 시스템 디렉터리를 의미합니다.

Added in version 3.7.

버전 3.12에서 변경: 윈도우 지원이 추가되었습니다.

Path.is_socket()

경로가 유닉스 소켓을 가리키면 True 를 반환합니다. 경로가 유효하지 않거나 접근할 수 없거나 누락된 경우, 또는 유닉스 소켓 이외의 대상을 가리키는 경우에는 False 가 반환됩니다. 이러한 경우들을 구분하려면 Path.stat() 을 사용하십시오.

Path.is_fifo()

경로가 FIFO를 가리키면 True 를 반환합니다. 경로가 유효하지 않거나 접근할 수 없거나 누락된 경우, 또는 FIFO 이외의 대상을 가리키는 경우에는 False 가 반환됩니다. 이러한 경우들을 구분하려면 Path.stat() 을 사용하십시오.

Path.is_block_device()

경로가 블록 장치를 가리키면 True 를 반환합니다. 경로가 유효하지 않거나 접근할 수 없거나 누락된 경우, 또는 블록 장치 이외의 대상을 가리키는 경우에는 False 가 반환됩니다. 이러한 경우들을 구분하려면 Path.stat() 을 사용하십시오.

Path.is_char_device()

경로가 문자 장치를 가리키면 True 를 반환합니다. 경로가 유효하지 않어 접근할 수 없거나 누락된 경우, 또는 문자 장치 이외의 대상을 가리키는 경우에는 False 가 반환됩니다. 이러한 경우들을 구분하려면 Path.stat() 을 사용하십시오.

Path.samefile(other_path)

이 경로가 other_path와 같은 파일을 가리키는지를 반환합니다. other_path는 Path 객체이거나 문자열일 수 있습니다. 의미는 os.path.samefile()os.path.samestat()과 유사합니다.

어떤 이유로 파일에 액세스할 수 없으면 OSError가 발생할 수 있습니다.

>>> p = Path('spam')
>>> q = Path('eggs')
>>> p.samefile(q)
False
>>> p.samefile('spam')
True

Added in version 3.5.

Path.info

파일 유형 정보를 쿼리하는 기능을 지원하는 PathInfo 객체입니다. 이 객체는 결과를 캐싱하는 메서드들을 제공하며, 이는 파일 유형에 따라 분기할 때 필요한 시스템 호출 횟수를 줄이는 데 도움이 됩니다. 예를 들면:

>>> p = Path('src')
>>> if p.info.is_symlink():
...     print('symlink')
... elif p.info.is_dir():
...     print('directory')
... elif p.info.exists():
...     print('something else')
... else:
...     print('not found')
...
directory

경로가 Path.iterdir() 로부터 생성된 경우, 이 어트리뷰트는 부모 디렉터리를 스캔하여 얻은 파일 유형 정보를 바탕으로 초기화됩니다. 단순히 Path.info 에 접근하는 것만으로는 파일 시스템 쿼리가 수행되지 않습니다.

최신 정보를 가져오려면 이 어트리뷰리의 메서드 대신 Path.is_dir(), is_file(), 그리고 is_symlink() 를 호출하는 것이 좋습니다. 캐시를 초기화하는 방법은 없으며, 대신 p = Path(p) 를 통해 빈 정보 캐션을 가진 새 경로 객체를 생성할 수 있습니다.

Added in version 3.14.

파일 읽기 및 쓰기

Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)

내장 open() 함수처럼, 경로가 가리키는 파일을 엽니다:

>>> p = Path('setup.py')
>>> with p.open() as f:
...     f.readline()
...
'#!/usr/bin/env python3\n'
Path.read_text(encoding=None, errors=None, newline=None)

가리키는 파일의 디코딩된 내용을 문자열로 반환합니다:

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

파일이 열린 다음에 닫힙니다. 선택적 매개 변수는 open()과 같은 의미입니다.

Added in version 3.5.

버전 3.13에서 변경: newline 매개 변수가 추가되었습니다.

Path.read_bytes()

가리키는 파일의 바이너리 내용을 바이트열 객체로 반환합니다:

>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'

Added in version 3.5.

Path.write_text(data, encoding=None, errors=None, newline=None)

가리키는 파일을 텍스트 모드로 열고, data를 쓴 다음, 파일을 닫습니다:

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

기록된 문자 수를 반환합니다.

같은 이름의 기존 파일을 덮어씁니다. 선택적 매개 변수는 open()에서와 같은 의미입니다.

Added in version 3.5.

버전 3.10에서 변경: newline 매개 변수가 추가되었습니다.

Path.write_bytes(data)

가리키는 파일을 바이너리 모드로 열고, data를 쓴 다음, 파일을 닫습니다:

>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'

기록된 바이트 수를 반환합니다.

같은 이름의 기존 파일을 덮어씁니다.

Added in version 3.5.

디렉터리 읽기

Path.iterdir()

경로가 디렉터리를 가리킬 때, 디렉터리 내용의 경로 객체를 산출합니다:

>>> p = Path('docs')
>>> for child in p.iterdir(): child
...
PosixPath('docs/conf.py')
PosixPath('docs/_templates')
PosixPath('docs/make.bat')
PosixPath('docs/index.rst')
PosixPath('docs/_build')
PosixPath('docs/_static')
PosixPath('docs/Makefile')

자식 항목들은 임의의 순서로 제공되며, 특수 항목인 '.''..' 은 포함되지 않습니다. 이터레이터를 생성한 후 디렉터리에서 파일이 삭제되거나 추가되는 경우, 해당 파일에 대한 경로 객체가 포함되는지는 정의되지 않습니다.

경로가 디렉터리가 아니거나 접근할 수 없는 경우, OSError 가 발생합니다.

Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False)

이 경로로 표현되는 디렉터리에서, 주어진 상대 pattern을 glob 하여, 일치하는 모든 파일을 (종류와 관계없이) 산출합니다:

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

참고

경로들은 특별한 순서 없이 반환됩니다. 특정 순서가 필요한 경우 결과를 정렬하십시오.

더 보기

패턴 언어 설명서.

기본값으로 설정되거나 case_sensitive 키워드 전용 인자가 None 인 경우, 이 메서드는 플랫폼별 대소문자 규칙을 사용하여 경로를 매치합니다. 일반적으로 POSIX에서는 대소문자를 구분하고, 윈도우에서는 구분하지 않습니다. 이 동작을 변경하려면 case_sensitiveTrue 또는 False 로 설정하십시오.

기본값으로 설정되거나 recurse_symlinks 키워드 전용 인자가 False 인 경우, 이 메서드는 “** “ 와일드카드를 확장하는 경우를 제외하고 심볼릭 링크를 따라갑니다. 항상 심볼릭 링크를 따르려면 recurse_symlinksTrue 로 설정하십시오.

참고

파일 시스템 스캔 중에 발생하는 모든 OSError 예외는 무시됩니다. 여기에는 읽기 권한이 없는 디렉터리에 접근할 때 발생하는 PermissionError 도 포함됩니다.

인자 self, pattern으로 감사 이벤트 pathlib.Path.glob을 발생시킵니다.

버전 3.12에서 변경: case_sensitive 매개변수가 추가되었습니다.

버전 3.13에서 변경: recurse_symlinks 매개 변수가 추가되었습니다.

버전 3.13에서 변경: pattern 매개변수는 경로류 객체 를 수용합니다.

버전 3.13에서 변경: 파일 시스템 스캔 중에 발생하는 모든 OSError 예외는 무시됩니다. 이전 버전에서는 이러한 예외가 많은 경우에 발생하지 않았으나, 모든 경우에 그러했던 것은 아닙니다.

Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False)

주어진 상대 pattern 을 재귀적으로 글로브(glob)합니다. 이는 pattern 앞에 “**/ “를 추가하여 Path.glob() 을 호출하는 것과 같습니다.

참고

경로들은 특별한 순서 없이 반환됩니다. 특정 순서가 필요한 경우 결과를 정렬하십시오.

참고

파일 시스템 스캔 중에 발생하는 모든 OSError 예외는 무시됩니다. 여기에는 읽기 권한이 없는 디렉터리에 접근할 때 발생하는 PermissionError 도 포함됩니다.

더 보기

패턴 언어Path.glob() 문서.

인자 self, pattern으로 감사 이벤트 pathlib.Path.rglob을 발생시킵니다.

버전 3.12에서 변경: case_sensitive 매개변수가 추가되었습니다.

버전 3.13에서 변경: recurse_symlinks 매개 변수가 추가되었습니다.

버전 3.13에서 변경: pattern 매개변수는 경로류 객체 를 수용합니다.

Path.walk(top_down=True, on_error=None, follow_symlinks=False)

트리를 하향식 또는 상향식으로 순회하여 디렉터리 트리의 파일 이름을 생성합니다.

self 를 루트로 하는 디렉터리 트리 내의 각 디렉터리에 대해( self 포함, ‘.’ 및 ‘..’ 제외), 이 메서드는 (dirpath, dirnames, filenames) 의 3-튜플을 산출합니다.

dirpath 은 현재 순회 중인 디렉터리에 대한 Path 이며, dirnamesdirpath 내의 하위 디렉터리 이름들을 담은 문자열 리스트( '.''..' 제외), filenamesdirpath 내의 파일들의 이름을 담은 문자열 리스트입니다. dirpath 에 있는 파일이나 디렉터리의 전체 경로(self 로 시작)를 얻으려면 dirpath / name 을 수행하십시오. 리스트가 정렬되어 있는지 여부는 파일 시스템에 따라 다릅니다.

선택적 인자 top_down 이 참이면(기본값), 디렉터리에 대한 3-튜플이 하위 디렉터리들의 3-튜플보다 먼저 생성됩니다(하향식 순회). top_down 이 거짓이면, 디렉터리에 대한 3-튜플이 모든 하위 디렉터리들의 3-튜플 이후에 생성됩니다(상향식 순회). top_down 의 값과 관계없이, 디렉터리와 그 하위 디렉터리의 3-튜플을 순회하기 전에 하위 디렉터리 목록을 먼저 가져옵니다.

When top_down is true, the caller can modify the dirnames list in-place (for example, using del or slice assignment), and Path.walk() will only recurse into the subdirectories whose names remain in dirnames. This can be used to prune the search, or to impose a specific order of visiting, or even to inform Path.walk() about directories the caller creates or renames before it resumes Path.walk() again. Modifying dirnames when top_down is false has no effect on the behavior of Path.walk() since the directories in dirnames have already been generated by the time dirnames is yielded to the caller.

기본적으로 os.scandir() 의 오류는 무시됩니다. 선택적 인자 on_error 가 지정되면, 이는 호출 가능한(callable) 객체여야 하며, 하나의 인자인 OSError 인스턴스와 함께 호출됩니다. 해당 callable은 오류를 처리하여 순회를 계속하거나, 예외를 다시 발생시켜 순회를 중단할 수 있습니다. 파일명은 예외 객체의 filename 어트리뷰터로 사용할 수 있습니다.

기본적으로 Path.walk() 는 심볼릭 링크를 따르지 않고 대신 이를 filenames 리스트에 추가합니다. follow_symlinks 를 true로 설정하면 심볼릭 링크를 해석하여 대상에 따라 dirnamesfilenames 에 배치하고, 결과적으로 지원되는 경우 심볼릭 링크가 가리키는 디렉터리를 방문합니다.

참고

follow_symlinks 를 true로 설정하면 링크가 자기 자신의 상위 디렉터리를 가리키는 경우 무한 재귀에 빠질 수 있음을 주의하십시오. Path.walk() 는 이미 방문한 디렉터리를 추적하지 않습니다.

참고

Path.walk() 은 순회하는 디렉터리가 실행 중에 수정되지 않는다고 가정합니다. 예를 들어, dirnames 중 하나인 디렉터리가 심볼릭 링크로 교체되고 follow_symlinks 가 false인 경우에도 Path.walk() 는 해당 위치로 내려가려고 시도할 것입니다. 이러한 동작을 방지하려면 적절하게 dirnames 에서 디렉터리를 제거하십시오.

참고

os.walk() 와 달리, Path.walk()follow_symlinks 가 false인 경우 디렉터리로 연결되는 심볼릭 링크를 filenames 에 나열합니다.

이 예제는 __pycache__ 디렉터리를 제외하고 각 디렉터리에 있는 모든 파일이 사용하는 바이트 수를 표시합니다:

from pathlib import Path
for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):
  print(
      root,
      "consumes",
      sum((root / file).stat().st_size for file in files),
      "bytes in",
      len(files),
      "non-directory files"
  )
  if '__pycache__' in dirs:
        dirs.remove('__pycache__')

다음 예제는 shutil.rmtree() 의 간단한 구현입니다. rmdir() 은 디렉터리가 비어있지 않으면 삭제할 수 없으므로, 트리를 상향식(bottom-up)으로 순회하는 것이 중요합니다:

# "top" 디렉터리에서 접근 가능한 모든 것을 삭제합니다.
# 주의: 이 작업은 위험합니다! 예를 들어, top이 Path('/')인 경우
# 모든 파일이 삭제될 수 있습니다.
for root, dirs, files in top.walk(top_down=False):
    for name in files:
        (root / name).unlink()
    for name in dirs:
        (root / name).rmdir()

Added in version 3.12.

파일 및 디렉터리 생성

Path.touch(mode=0o666, exist_ok=True)

이 경로에 파일을 생성합니다. mode 가 제공되면, 프로세스의 umask 값과 결합하여 파일 모드 및 접근 플래그를 결정합니다. 파일이 이미 존재하는 경우, exist_ok 가 true이면 성공하고(그리고 수정 시간이 현재 시간으로 업데이트됨), 그렇지 않으면 FileExistsError 가 발생합니다.

더 보기

open(), write_text(), 그리고 write_bytes() 메서드는 파일 생성 시 자주 사용됩니다.

Path.mkdir(mode=0o777, parents=False, exist_ok=False, *, parent_mode=None)

이 경로에 새로운 디렉터리를 생성합니다. mode 가 지정된 경우, 프로세스의 umask 값과 결합하여 파일 모드 및 접근 플래그를 결정합니다. 경로가 이미 존재하는 경우 FileExistsError 가 발생합니다.

parents가 참이면, 이 경로의 누락 된 부모를 필요하면 만듭니다; 이것들은 mode를 고려하지 않고 기본 권한으로 만들어집니다 (POSIX mkdir -p 명령을 모방합니다).

parent_modeNone 이 아니면, parents 가 True일 때 새로 생성되는 중간 단계의 디렉터리에 해당 모드가 적용됩니다. mode 와 마찬가지로 프로세스의 umask 값과 결합됩니다. 그렇지 않으면 중간 디렉터리는 기본 권한(마찬가지로 umask의 영향을 받음)으로 생성됩니다.

parents가 거짓(기본값)이면, 누락된 부모가 FileNotFoundError를 발생시킵니다.

exist_ok가 거짓(기본값)이면, 대상 디렉터리가 이미 존재하면 FileExistsError가 발생합니다.

exist_ok 가 True이면, 주어진 경로가 이미 파일 시스템에 존재하고 디렉터리가 아닌 경우를 제외하고 FileExistsError 가 발생하지 않습니다(POSIX mkdir -p 명령과 동일한 동작).

버전 3.5에서 변경: exist_ok 매개 변수가 추가되었습니다.

Added in version 3.15: parent_mode 파라미터입니다.

이 경로를 target 을 가리키는 심볼릭 링크로 만듭니다.

Windows에서 심볼릭 링크는 파일 또는 디렉터리 중 하나를 나타내며, 동적으로 대상에 맞춰 변형되지 않습니다. 대상이 존재하는 경우 심볼릭 링크의 유형을 일치하게 생성합니다. 그렇지 않은 경우, target_is_directory 가 True이면 디렉터리로, 아니면 파일 심볼릭 링크(기본값)로 생성합니다. Windows 이외의 플랫폼에서는 target_is_directory 가 무시됩니다.

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.resolve()
PosixPath('/home/antoine/pathlib/setup.py')
>>> p.stat().st_size
956
>>> p.lstat().st_size
8

참고

인자의 순서(링크, 대상)는 os.symlink()와 반대입니다.

버전 3.13에서 변경: os.symlink() 를 사용할 수 없는 경우 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 NotImplementedError 가 발생했습니다.

이 경로를 target 과 동일한 파일에 대한 하드 링크로 만듭니다.

참고

인자의 순서(링크, 대상)는 os.link() 와 반대입니다.

Added in version 3.10.

버전 3.13에서 변경: os.link() 을 사용할 수 없는 경우 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 NotImplementedError 가 발생했습니다.

복사, 이동 및 삭제

Path.copy(target, *, follow_symlinks=True, preserve_metadata=False)

이 파일 또는 디렉터리 트리를 지정된 target 으로 복사하고, target 을 가리키는 새로운 Path 인스턴스를 반환합니다.

원본이 파일인 경우 대상이 기존 파일이면 대체됩니다. 원본이 심볼릭 링크이고 follow_symlinks 가 True(기본값)이면 심볼릭 링크의 대상을 복사합니다. 그렇지 않으면 목적지에 심볼릭 링크를 다시 생성합니다.

preserve_metadata 가 False(기본값)인 경우 디렉터리 구조와 파일 데이터만 복사됨을 보장합니다. 파일 및 디렉터리 권한, 플래그, 최종 접근 및 수정 시간, 확장 속성이 지원되는 환경에서 복사되도록 하려면 preserve_metadata 를 True로 설정하십시오. 이 인자는 메타데이터가 항상 유지되는 Windows에서 파일을 복사할 때는 영향이 없습니다.

참고

운영체제 및 파일 시스템에서 지원하는 경우, 이 메서드는 데이터 블록이 수정될 때만 복사되는 경량 복사를 수행합니다. 이를 쓰기 시 복사(copy-on-write)라고 합니다.

Added in version 3.14.

Path.copy_into(target_dir, *, follow_symlinks=True, preserve_metadata=False)

이 파일 또는 디렉터리 트리를 기존 디렉터리인 target_dir 로 복사합니다. 다른 인자들은 Path.copy() 와 동일하게 처리됩니다. 복사본을 가리키는 새로운 Path 인스턴스를 반환합니다.

Added in version 3.14.

Path.rename(target)

이 파일 또는 디렉터리의 이름을 지정된 target 으로 변경하고, target 을 가리키는 새로운 Path 인스턴스를 반환합니다. Unix에서 target 이 존재하고 파일인 경우 사용자가 권한을 가지고 있으면 조용히 대체됩니다. Windows에서 target 이 존재하는 경우 FileExistsError 가 발생합니다. target 은 문자열 또는 다른 경로 객체일 수 있습니다.

>>> p = Path('foo')
>>> p.open('w').write('some text')
9
>>> target = Path('bar')
>>> p.rename(target)
PosixPath('bar')
>>> target.open().read()
'some text'

대상 경로는 절대 경로 또는 상대 경로일 수 있습니다. 상대 경로는 Path 객체의 디렉터리가 아닌 현재 작업 디렉터리를 기준으로 해석됩니다.

os.rename() 을 기반으로 구현되며 동일한 보장을 제공합니다.

버전 3.8에서 변경: 반환 값을 추가하여 새로운 Path 인스턴스를 반환합니다.

Path.replace(target)

이 파일 또는 디렉터리의 이름을 지정된 target 으로 변경하고, target 을 가리키는 새로운 Path 인스턴스를 반환합니다. target 이 기존 파일이나 빈 디렉터리를 가리키는 경우 조건 없이 대체됩니다.

대상 경로는 절대 경로 또는 상대 경로일 수 있습니다. 상대 경로는 Path 객체의 디렉터리가 아닌 현재 작업 디렉터리를 기준으로 해석됩니다.

버전 3.8에서 변경: 반환 값을 추가하여 새로운 Path 인스턴스를 반환합니다.

Path.move(target)

이 파일 또는 디렉터리 트리를 지정된 target 으로 이동시키고, target 을 가리키는 새로운 Path 인스턴스를 반환합니다.

target 이 존재하지 않으면 생성됩니다. 이 경로와 target 이 모두 기존 파일인 경우, 대상이 덮어써집니다. 두 경로가 동일한 파일이나 디렉터리를 가리키거나, target 이 비어 있지 않은 디렉터리인 경우 OSError 가 발생합니다.

두 경로가 동일한 파일 시스템에 있으면 os.replace() 를 사용하여 이동을 수행합니다. 그렇지 않으면 이 경로를 복사(메타데이터 및 심볼릭 링크 유지)한 후 삭제합니다.

Added in version 3.14.

Path.move_into(target_dir)

이 파일 또는 디렉터리 트리를 기존 디렉터리인 target_dir 로 이동시킵니다. 이동된 경로를 가리키는 새로운 Path 인스턴스를 반환합니다.

Added in version 3.14.

이 파일이나 심볼릭 링크를 제거합니다. 경로가 디렉터리를 가리키면, Path.rmdir()을 대신 사용하십시오.

missing_ok가 거짓(기본값)이면, 경로가 없을 때 FileNotFoundError가 발생합니다.

missing_ok가 참이면, FileNotFoundError 예외는 무시됩니다 (POSIX rm -f 명령과 같은 동작).

버전 3.8에서 변경: missing_ok 매개 변수가 추가되었습니다.

Path.rmdir()

이 디렉터리를 제거합니다. 디렉터리는 비어 있어야 합니다.

권한 및 소유권

Path.owner(*, follow_symlinks=True)

파일을 소유한 사용자의 이름을 반환합니다. 시스템 데이터베이스에서 파일의 사용자 식별자(UID)를 찾을 수 없는 경우 KeyError 가 발생합니다.

이 메서드는 보통 심볼릭 링크를 따릅니다. 심볼릭 링크의 소유자를 가져오려면 follow_symlinks=False 인자를 추가하십시오.

버전 3.13에서 변경: pwd 모듈을 사용할 수 없는 경우 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 NotImplementedError 가 발생했습니다.

버전 3.13에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.group(*, follow_symlinks=True)

파일을 소유하는 그룹의 이름을 반환합니다. 시스템 데이터베이스에서 파일의 그룹 식별자(GID)를 찾을 수 없는 경우 KeyError 가 발생합니다.

이 메서드는 보통 심볼릭 링크를 따릅니다. 심볼릭 링크의 그룹을 가져오려면 follow_symlinks=False 인자를 추가하십시오.

버전 3.13에서 변경: grp 모듈을 사용할 수 없는 경우 UnsupportedOperation 을 발생시킵니다. 이전 버전에서는 NotImplementedError 가 발생했습니다.

버전 3.13에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.chmod(mode, *, follow_symlinks=True)

os.chmod() 와 같이 파일 모드와 권한을 변경합니다.

이 메서드는 보통 심볼릭 링크를 따릅니다. 일부 유닉스 환경에서는 심볼릭 링크 자체의 권한을 변경하는 것을 지원합니다. 이러한 플랫폼에서는 follow_symlinks=False 인자를 추가하거나 lchmod() 를 사용할 수 있습니다.

>>> p = Path('setup.py')
>>> p.stat().st_mode
33277
>>> p.chmod(0o444)
>>> p.stat().st_mode
33060

버전 3.10에서 변경: follow_symlinks 매개변수가 추가되었습니다.

Path.lchmod(mode)

Path.chmod()와 비슷하지만, 경로가 심볼릭 링크를 가리키면, 대상이 아닌 심볼릭 링크의 모드가 변경됩니다.

패턴 언어

full_match(), glob()rglob() 의 패턴에서 다음 와일드카드를 지원합니다:

** (전체 세그먼트)

0개를 포함하여 임의의 수의 파일 또는 디렉터리 세그먼트와 일치합니다.

* (전체 세그먼트)

하나의 파일 또는 디렉터리 세그먼트와 일치합니다.

* (세그먼트의 일부)

0개를 포함하여 임의의 수의 구분자가 아닌 문자와 일치합니다.

?

하나의 구분자가 아닌 문자와 일치합니다.

[seq]

seq 이 문자의 시퀀스인 경우, seq 내의 문자 하나와 일치합니다. 범위 표현이 지원됩니다. 예를 들어, [a-z] 는 모든 소문자 ASCII 문자와 일치합니다. 여러 범위를 결합할 수 있습니다: [a-zA-Z0-9_] 는 ASCII 문자, 숫자 또는 밑줄과 일치합니다.

[!seq]

seq 이 위와 동일한 규칙을 따르는 경우, seq 에 포함되지 않은 문자 하나와 일치합니다.

리터럴 일치를 위해서는 메타 문자를 대괄호로 감쌉니다. 예를 들어, "[?]" 는 문자 "?" 와 일치합니다.

**” 와일드카드는 재귀적 glob을 활성화합니다. 몇 가지 예시는 다음과 같습니다:

패턴

의미

**/*

최소 하나 이상의 세그먼트가 있는 모든 경로.

**/*.py

.py”로 끝나는 마지막 세그먼트가 있는 모든 경로.

assets/**

assets/”로 시작하는 모든 경로.

assets/**/*

assets/” 자체를 제외하고 “assets/”로 시작하는 모든 경로.

참고

**” 와일드카드를 사용한 glob은 트리 내의 모든 디렉터리를 방문합니다. 규모가 큰 디렉터리 트리는 검색에 오랜 시간이 걸릴 수 있습니다.

버전 3.13에서 변경: **”로 끝나는 패턴을 사용한 glob은 파일과 디렉터리를 모두 반환합니다. 이전 버전에서는 디렉터리만 반환했습니다.

Path.glob()rglob() 에서 디렉터리만 일치시키려면 패턴 끝에 슬래시를 추가할 수 있습니다.

버전 3.11에서 변경: 경로 구성 요소 구분자(sep 또는 altsep)로 끝나는 패턴을 사용한 glob은 디렉터리만 반환합니다.

glob 모듈과의 비교

Path.glob()Path.rglob() 이 수용하는 패턴과 생성되는 결과는 glob 모듈과 약간 다릅니다:

  1. 점(.)으로 시작하는 파일은 pathlib에서 특별하게 취급되지 않습니다. 이는 glob.glob()include_hidden=True 를 전달하는 것과 같습니다.

  2. ** “ 패턴 구성 요소는 pathlib에서 항상 재귀적입니다. 이는 glob.glob()recursive=True 를 전달하는 것과 같습니다.

  3. ** “ 패턴 구성 요소는 pathlib에서 기본적으로 심볼릭 링크를 따르지 않습니다. 이 동작은 glob.glob() 과 동일한 기능이 없으나, 호환되는 동작을 위해 Path.glob()recurse_symlinks=True 를 전달할 수 있습니다.

  4. 모든 PurePathPath 객체와 마찬가지로, Path.glob()Path.rglob() 에서 반환되는 값에는 끝에 슬래시가 포함되지 않습니다.

  5. pathlib의 path.glob()path.rglob() 에서 반환되는 값은 glob.glob(root_dir=path) 의 결과와 달리 path 를 접두사로 포함합니다.

  6. pathlib의 path.glob()path.rglob() 에서 반환되는 값은 예를 들어 “** “를 glob할 때 path 자체를 포함할 수 있는 반면, glob.glob(root_dir=path) 결과는 path 에 해당하는 빈 문자열을 절대 포함하지 않습니다.

osos.path 모듈과의 비교

pathlib은 PurePathPath 객체를 사용하여 경로 연산을 구현하므로 객체 지향적 이라고 할 수 있습니다. 반면에, osos.path 모듈은 저수준 strbytes 객체와 함께 작동하는 함수를 제공하며, 이는 더 절차적 인 접근 방식입니다. 일부 사용자는 객체 지향적 스타일이 가독성이 더 높다고 판단합니다.

osos.path 의 많은 함수는 bytes 경로와 디렉터리 기술자에 상대적인 경로 를 지원합니다. 이러한 기능은 pathlib에서 사용할 수 없습니다.

파이썬의 strbytes 타입과 os, os.path 모듈의 일부는 C로 작성되어 매우 빠릅니다. pathlib은 순수 파이썬으로 작성되어 종종 더 느리지만, 실질적으로 문제가 될 정도로 느린 경우는 드뭅니다.

pathlib의 경로 정규화는 os.path 보다 약간 더 일관적이고 원칙을 고수합니다. 예를 들어, os.path.abspath() 는 경로에서 “.. “ 세그먼트를 제거하는데 이는 심볼릭 링크가 포함된 경우 의미를 바꿀 수 있지만, Path.absolute() 는 안전성을 위해 이러한 세그먼트를 유지합니다.

pathlib의 경로 정규화로 인해 일부 애플리케이션에 적합하지 않을 수 있습니다:

  1. pathlib은 Path("my_folder/")Path("my_folder") 로 정규화하며, 이는 다양한 운영 체제 API 및 명령줄 도구에 제공될 때 경로의 의미를 변경합니다. 구체적으로, 끝에 오는 구분자가 없으면 해당 경로가 디렉터리뿐만 아니라 파일이나 디렉터리 중 하나로 해석될 수 있습니다.

  2. pathlib은 Path("./my_program")Path("my_program") 로 정규화하며, 이는 셸이나 자식 프로세스를 생성할 때와 같이 실행 파일 검색 경로로 사용될 경우 경로의 의미를 변경합니다. 구체적으로, 경로에 구분자가 없으면 현재 디렉터리가 아닌 PATH 에서 해당 경로를 찾게 될 수 있습니다.

이러한 차이의 결과로, pathlib은 os.path 를 그대로 대체할 수 있는 솔루션이 아닙니다.

상응하는 도구

아래는 다양한 os 함수를 해당 PurePath/Path 대응 물에 매핑하는 표입니다.

osos.path

pathlib

os.path.dirname()

PurePath.parent

os.path.basename()

PurePath.name

os.path.splitext()

PurePath.stem, PurePath.suffix

os.path.join()

PurePath.joinpath()

os.path.isabs()

PurePath.is_absolute()

os.path.relpath()

PurePath.relative_to() [1]

os.path.expanduser()

Path.expanduser() [2]

os.path.realpath()

Path.resolve()

os.path.abspath()

Path.absolute() [3]

os.path.exists()

Path.exists()

os.path.isfile()

Path.is_file()

os.path.isdir()

Path.is_dir()

os.path.islink()

Path.is_symlink()

os.path.isjunction()

Path.is_junction()

os.path.ismount()

Path.is_mount()

os.path.samefile()

Path.samefile()

os.getcwd()

Path.cwd()

os.stat()

Path.stat()

os.lstat()

Path.lstat()

os.listdir()

Path.iterdir()

os.walk()

Path.walk() [4]

os.mkdir(), os.makedirs()

Path.mkdir()

os.link()

Path.hardlink_to()

os.symlink()

Path.symlink_to()

os.readlink()

Path.readlink()

os.rename()

Path.rename()

os.replace()

Path.replace()

os.remove(), os.unlink()

Path.unlink()

os.rmdir()

Path.rmdir()

os.chmod()

Path.chmod()

os.lchmod()

Path.lchmod()

각주

프로토콜

pathlib.types 모듈은 정적 형 검사를 위한 형을 제공합니다.

Added in version 3.14.

class pathlib.types.PathInfo

Path.info 속성을 설명하는 typing.Protocol 입니다. 구현체는 메서드에서 캐시된 결과를 반환할 수 있습니다.

exists(*, follow_symlinks=True)

경로가 존재하는 파일 또는 디렉터리이거나 다른 종류의 파일인 경우 True 를 반환하고, 존재하지 않는 경우 False 를 반환합니다.

follow_symlinksFalse 인 경우, 대상이 존재하는지 확인하지 않고 심볼릭 링크에 대해 True 를 반환합니다.

is_dir(*, follow_symlinks=True)

경로가 디렉터리이거나 디렉터리를 가리키는 심볼릭 링크인 경우 True 를 반환하고, 다른 종류의 파일이거나 존재하지 않는 경우 False 를 반환합니다.

follow_symlinksFalse 인 경우, 경로가 디렉터리일 때만(심볼릭 링크를 따르지 않음) True 를 반환하고, 다른 종류의 파일이거나 존재하지 않는 경우 False 를 반환합니다.

is_file(*, follow_symlinks=True)

경로가 파일이거나 파일을 가리키는 심볼릭 링크인 경우 True 를 반환하고, 디렉터리 또는 다른 비파일이거나 존재하지 않는 경우 False 를 반환합니다.

follow_symlinksFalse 인 경우, 경로가 파일일 때만(심볼릭 링크를 따르지 않음) True 를 반환하고, 디렉터리 또는 다른 비파일이거나 존재하지 않는 경우 False 를 반환합니다.

경로가 심볼릭 링크인 경우(깨진 링크 포함) True 를 반환하고, 디렉터리나 다른 종류의 파일이거나 존재하지 않는 경우 False 를 반환합니다.

분실물 보관소