pathlib.md
1> **Источник:** https://python-all.ru/3.13/library/pathlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pathlib` – Объектно-ориентированные пути файловой системы89Добавлено в версии 3.4.1011**Исходный код:** [Lib/pathlib/](https://python-all.ru/src/3.13/Lib/pathlib)1213---1415Этот модуль предоставляет классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на [чистые пути](https://python-all.ru/3.13/library/pathlib.html#pure-paths), которые выполняют только вычислительные операции без ввода-вывода, и [конкретные пути](https://python-all.ru/3.13/library/pathlib.html#concrete-paths), которые наследуют чистые пути, но также предоставляют операции ввода-вывода.16171819Если вы никогда не пользовались этим модулем раньше или просто не уверены, какой класс подходит для вашей задачи, скорее всего, вам нужен [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path). Он создаёт экземпляр [конкретного пути](https://python-all.ru/3.13/library/pathlib.html#concrete-paths) для платформы, на которой выполняется код.2021Чистые пути полезны в некоторых особых случаях; например:22231. Если требуется манипулировать путями Windows на машине Unix (или наоборот). При работе на Unix нельзя создать экземпляр [`WindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.WindowsPath), но можно создать [`PureWindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PureWindowsPath).242. Если нужно, чтобы код только манипулировал путями без фактического обращения к ОС. В таком случае может быть полезно создать экземпляр одного из чистых классов, поскольку они просто не имеют операций доступа к ОС.2526> **См. также**27>28> [**PEP 428**](https://python-all.ru/3.13/library/pathlib.html): модуль pathlib – объектно-ориентированные пути файловой системы.2930> **См. также**31>32> Для низкоуровневых манипуляций с путями в виде строк можно также использовать модуль [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path).3334## Основное использование3536Импорт основного класса:3738```python39>>> from pathlib import Path40```4142Список подкаталогов:4344```python45>>> p = Path('.')46>>> [x for x in p.iterdir() if x.is_dir()]47[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),48 PosixPath('__pycache__'), PosixPath('build')]49```5051Список исходных файлов Python в этом дереве каталогов:5253```python54>>> list(p.glob('**/*.py'))55[PosixPath('test_pathlib.py'), PosixPath('setup.py'),56 PosixPath('pathlib.py'), PosixPath('docs/conf.py'),57 PosixPath('build/lib/pathlib.py')]58```5960Навигация по дереву каталогов:6162```python63>>> p = Path('/etc')64>>> q = p / 'init.d' / 'reboot'65>>> q66PosixPath('/etc/init.d/reboot')67>>> q.resolve()68PosixPath('/etc/rc.d/init.d/halt')69```7071Запрос свойств пути:7273```python74>>> q.exists()75True76>>> q.is_dir()77False78```7980Открытие файла:8182```python83>>> with q.open() as f: f.readline()84...85'#!/bin/bash\n'86```8788## Исключения8990#### `exception pathlib.UnsupportedOperation`9192Исключение, наследующее [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError), которое возбуждается при вызове неподдерживаемой операции над объектом пути.9394Добавлено в версии 3.13.9596## Чистые пути9798Объекты чистых путей предоставляют операции обработки путей, которые не обращаются к файловой системе. Существует три способа доступа к этим классам, которые также называются *разновидностями*:99100#### `class pathlib.PurePath(*pathsegments)`101102Общий класс, представляющий разновидность пути системы (при создании экземпляра создаётся либо [`PurePosixPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePosixPath), либо [`PureWindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PureWindowsPath)):103104```python105>>> PurePath('setup.py') # Запуск на Unix-машине106PurePosixPath('setup.py')107```108109Каждый элемент *pathsegments* может быть либо строкой, представляющей сегмент пути, либо объектом, реализующим интерфейс [`os.PathLike`](https://python-all.ru/3.13/library/os.html#os.PathLike), где метод [`__fspath__()`](https://python-all.ru/3.13/library/os.html#os.PathLike.__fspath__) возвращает строку, например, другой объект пути:110111```python112>>> PurePath('foo', 'some/path', 'bar')113PurePosixPath('foo/some/path/bar')114>>> PurePath(Path('foo'), Path('bar'))115PurePosixPath('foo/bar')116```117118Когда *pathsegments* пуст, подразумевается текущий каталог:119120```python121>>> PurePath()122PurePosixPath('.')123```124125Если сегмент является абсолютным путём, все предыдущие сегменты игнорируются (как [`os.path.join()`](https://python-all.ru/3.13/library/os.path.html#os.path.join)):126127```python128>>> PurePath('/etc', '/usr', 'lib64')129PurePosixPath('/usr/lib64')130>>> PureWindowsPath('c:/Windows', 'd:bar')131PureWindowsPath('d:bar')132```133134В Windows диск не сбрасывается при обнаружении корневого относительного сегмента пути (например, `r'\foo'`):135136```python137>>> PureWindowsPath('c:/Windows', '/Program Files')138PureWindowsPath('c:/Program Files')139```140141Лишние косые черты и одиночные точки схлопываются, но двойные точки (`'..'`) и начальные двойные косые черты (`'//'`) – нет, поскольку это изменило бы значение пути по разным причинам (например, символические ссылки, UNC-пути):142143```python144>>> PurePath('foo//bar')145PurePosixPath('foo/bar')146>>> PurePath('//foo/bar')147PurePosixPath('//foo/bar')148>>> PurePath('foo/./bar')149PurePosixPath('foo/bar')150>>> PurePath('foo/../bar')151PurePosixPath('foo/../bar')152```153154(наивный подход сделал бы `PurePosixPath('foo/../bar')` эквивалентным `PurePosixPath('bar')`, что неверно, если `foo` является символической ссылкой на другой каталог)155156Объекты чистых путей реализуют интерфейс [`os.PathLike`](https://python-all.ru/3.13/library/os.html#os.PathLike), что позволяет использовать их везде, где этот интерфейс принимается.157158Изменено в версии 3.6: Добавлена поддержка интерфейса [`os.PathLike`](https://python-all.ru/3.13/library/os.html#os.PathLike).159160#### `class pathlib.PurePosixPath(*pathsegments)`161162Подкласс [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы, отличные от Windows:163164```python165>>> PurePosixPath('/etc/hosts')166PurePosixPath('/etc/hosts')167```168169Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath).170171#### `class pathlib.PureWindowsPath(*pathsegments)`172173Подкласс [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы Windows, включая [UNC-пути](https://python-all.ru/3.13/library/pathlib.html):174175```python176>>> PureWindowsPath('c:/', 'Users', 'Ximénez')177PureWindowsPath('c:/Users/Ximénez')178>>> PureWindowsPath('//server/share/file')179PureWindowsPath('//server/share/file')180```181182Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath).183184Независимо от используемой системы можно создавать экземпляры всех этих классов, поскольку они не предоставляют никаких операций, совершающих системные вызовы.185186### Общие свойства187188Пути неизменяемы и [хэшируемые](https://python-all.ru/3.13/glossary.html#term-hashable). Пути одной разновидности сравнимы и упорядочиваемы. Эти свойства учитывают семантику приведения регистра данной разновидности:189190```python191>>> PurePosixPath('foo') == PurePosixPath('FOO')192False193>>> PureWindowsPath('foo') == PureWindowsPath('FOO')194True195>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }196True197>>> PureWindowsPath('C:') < PureWindowsPath('d:')198True199```200201Пути разных разновидностей неравны и не упорядочиваются:202203```python204>>> PureWindowsPath('foo') == PurePosixPath('foo')205False206>>> PureWindowsPath('foo') < PurePosixPath('foo')207Traceback (most recent call last):208 File "<stdin>", line 1, in <module>209TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'210```211212### Операторы213214Оператор косой черты помогает создавать дочерние пути, например [`os.path.join()`](https://python-all.ru/3.13/library/os.path.html#os.path.join). Если аргумент является абсолютным путём, предыдущий путь игнорируется. В Windows диск не сбрасывается, если аргумент является относительным путём с корнем (например, `r'\foo'`):215216```python217>>> p = PurePath('/etc')218>>> p219PurePosixPath('/etc')220>>> p / 'init.d' / 'apache2'221PurePosixPath('/etc/init.d/apache2')222>>> q = PurePath('bin')223>>> '/usr' / q224PurePosixPath('/usr/bin')225>>> p / '/an_absolute_path'226PurePosixPath('/an_absolute_path')227>>> PureWindowsPath('c:/Windows', '/Program Files')228PureWindowsPath('c:/Program Files')229```230231Объект пути можно использовать везде, где принимается объект, реализующий [`os.PathLike`](https://python-all.ru/3.13/library/os.html#os.PathLike):232233```python234>>> import os235>>> p = PurePath('/etc')236>>> os.fspath(p)237'/etc'238```239240Строковое представление пути – это сам сырой путь файловой системы (в нативном виде, например с обратными слешами в Windows), который можно передать любой функции, принимающей путь к файлу в виде строки:241242```python243>>> p = PurePath('/etc')244>>> str(p)245'/etc'246>>> p = PureWindowsPath('c:/Program Files')247>>> str(p)248'c:\\Program Files'249```250251Аналогично, вызов [`bytes`](https://python-all.ru/3.13/library/stdtypes.html#bytes) для пути возвращает сырой путь файловой системы в виде объекта bytes, закодированный с помощью [`os.fsencode()`](https://python-all.ru/3.13/library/os.html#os.fsencode):252253```python254>>> bytes(p)255b'/etc'256```257258> **Примечание**259>260> Вызов [`bytes`](https://python-all.ru/3.13/library/stdtypes.html#bytes) рекомендуется только в Unix. В Windows форма Unicode является каноническим представлением путей файловой системы.261262### Доступ к отдельным частям263264Для доступа к отдельным «частям» (компонентам) пути используйте следующее свойство:265266#### `PurePath.parts`267268Кортеж, предоставляющий доступ к различным компонентам пути:269270```python271>>> p = PurePath('/usr/bin/python3')272>>> p.parts273('/', 'usr', 'bin', 'python3')274275>>> p = PureWindowsPath('c:/Program Files/PSF')276>>> p.parts277('c:\\', 'Program Files', 'PSF')278```279280(обратите внимание, как диск и локальный корень объединены в одну часть)281282### Методы и свойства283284Чистые пути предоставляют следующие методы и свойства:285286#### `PurePath.parser`287288Реализация модуля [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path), используемая для низкоуровневого разбора и объединения путей: либо `posixpath`, либо `ntpath`.289290Добавлено в версии 3.13.291292#### `PurePath.drive`293294Строка, представляющая букву или имя диска, если таковой имеется:295296```python297>>> PureWindowsPath('c:/Program Files/').drive298'c:'299>>> PureWindowsPath('/Program Files/').drive300''301>>> PurePosixPath('/etc').drive302''303```304305UNC-ресурсы также считаются дисками:306307```python308>>> PureWindowsPath('//host/share/foo.txt').drive309'\\\\host\\share'310```311312#### `PurePath.root`313314Строка, представляющая (локальный или глобальный) корень, если таковой имеется:315316```python317>>> PureWindowsPath('c:/Program Files/').root318'\\'319>>> PureWindowsPath('c:Program Files/').root320''321>>> PurePosixPath('/etc').root322'/'323```324325UNC-ресурсы всегда имеют корень:326327```python328>>> PureWindowsPath('//host/share').root329'\\'330```331332Если путь начинается с более чем двух последовательных слешей, [`PurePosixPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePosixPath) схлопывает их:333334```python335>>> PurePosixPath('//etc').root336'//'337>>> PurePosixPath('///etc').root338'/'339>>> PurePosixPath('////etc').root340'/'341```342343> **Примечание**344>345> Это поведение соответствует *The Open Group Base Specifications Issue 6*, пункту [4.11 Pathname Resolution](https://python-all.ru/3.13/library/pathlib.html):346>347> *«Имя пути, начинающееся с двух последовательных слешей, может интерпретироваться способом, определяемым реализацией, хотя более двух начальных слешей должны рассматриваться как один слеш.»*348349#### `PurePath.anchor`350351Объединение диска и корневого каталога:352353```python354>>> PureWindowsPath('c:/Program Files/').anchor355'c:\\'356>>> PureWindowsPath('c:Program Files/').anchor357'c:'358>>> PurePosixPath('/etc').anchor359'/'360>>> PureWindowsPath('//host/share').anchor361'\\\\host\\share\\'362```363364#### `PurePath.parents`365366Неизменяемая последовательность, обеспечивающая доступ к логическим предкам пути:367368```python369>>> p = PureWindowsPath('c:/foo/bar/setup.py')370>>> p.parents[0]371PureWindowsPath('c:/foo/bar')372>>> p.parents[1]373PureWindowsPath('c:/foo')374>>> p.parents[2]375PureWindowsPath('c:/')376```377378Изменено в версии 3.10: Последовательность parents теперь поддерживает [срезы](https://python-all.ru/3.13/glossary.html#term-slice) и отрицательные значения индексов.379380#### `PurePath.parent`381382Логический родитель пути:383384```python385>>> p = PurePosixPath('/a/b/c/d')386>>> p.parent387PurePosixPath('/a/b/c')388```389390Нельзя выйти за пределы anchor или пустого пути:391392```python393>>> p = PurePosixPath('/')394>>> p.parent395PurePosixPath('/')396>>> p = PurePosixPath('.')397>>> p.parent398PurePosixPath('.')399```400401> **Примечание**402>403> Это чисто лексическая операция, поэтому поведение следующее:404>405> ```python406> >>> p = PurePosixPath('foo/..')407> >>> p.parent408> PurePosixPath('foo')409> ```410>411> Если нужно подняться вверх по произвольному пути файловой системы, рекомендуется сначала вызвать [`Path.resolve()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.resolve), чтобы разрешить символические ссылки и убрать компоненты `".."`.412413#### `PurePath.name`414415Строка, представляющая последний компонент пути, исключая диск и корневой каталог (если они есть):416417```python418>>> PurePosixPath('my/library/setup.py').name419'setup.py'420```421422UNC-имена дисков не учитываются:423424```python425>>> PureWindowsPath('//some/share/setup.py').name426'setup.py'427>>> PureWindowsPath('//some/share').name428''429```430431#### `PurePath.suffix`432433Последняя часть последнего компонента, отделённая точкой (если есть):434435```python436>>> PurePosixPath('my/library/setup.py').suffix437'.py'438>>> PurePosixPath('my/library.tar.gz').suffix439'.gz'440>>> PurePosixPath('my/library').suffix441''442```443444Обычно это называется расширением файла.445446#### `PurePath.suffixes`447448Список суффиксов пути, часто называемых расширениями файлов:449450```python451>>> PurePosixPath('my/library.tar.gar').suffixes452['.tar', '.gar']453>>> PurePosixPath('my/library.tar.gz').suffixes454['.tar', '.gz']455>>> PurePosixPath('my/library').suffixes456[]457```458459#### `PurePath.stem`460461Последний компонент пути без суффикса:462463```python464>>> PurePosixPath('my/library.tar.gz').stem465'library.tar'466>>> PurePosixPath('my/library.tar').stem467'library'468>>> PurePosixPath('my/library').stem469'library'470```471472#### `PurePath.as_posix()`473474Возвращает строковое представление пути с прямыми слэшами (`/`):475476```python477>>> p = PureWindowsPath('c:\\windows')478>>> str(p)479'c:\\windows'480>>> p.as_posix()481'c:/windows'482```483484#### `PurePath.is_absolute()`485486Возвращает, является ли путь абсолютным. Путь считается абсолютным, если у него есть и корень, и (если это допускает разновидность) диск:487488```python489>>> PurePosixPath('/a/b').is_absolute()490True491>>> PurePosixPath('a/b').is_absolute()492False493494>>> PureWindowsPath('c:/a/b').is_absolute()495True496>>> PureWindowsPath('/a/b').is_absolute()497False498>>> PureWindowsPath('c:').is_absolute()499False500>>> PureWindowsPath('//some/share').is_absolute()501True502```503504#### `PurePath.is_relative_to(other)`505506Возвращает, является ли этот путь относительным по отношению к пути *other*.507508```python509>>> p = PurePath('/etc/passwd')510>>> p.is_relative_to('/etc')511True512>>> p.is_relative_to('/usr')513False514```515516Этот метод основан на строках; он не обращается к файловой системе и не обрабатывает сегменты “`..`” особым образом. Следующий код эквивалентен:517518```python519>>> u = PurePath('/usr')520>>> u == p or u in p.parents521False522```523524Добавлено в версии 3.9.525526Устарело с версии 3.12, будет удалено в версии 3.14: Передача дополнительных аргументов устарела; если они указаны, они объединяются с *other*.527528#### `PurePath.is_reserved()`529530С [`PureWindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PureWindowsPath) возвращает `True`, если путь считается зарезервированным в Windows, иначе `False`. С [`PurePosixPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePosixPath) всегда возвращается `False`.531532Изменено в версии 3.13: Имена путей Windows, содержащие двоеточие или заканчивающиеся точкой или пробелом, считаются зарезервированными. UNC-пути могут быть зарезервированы.533534Устарело с версии 3.13, будет удалено в версии 3.15: Этот метод устарел; используйте [`os.path.isreserved()`](https://python-all.ru/3.13/library/os.path.html#os.path.isreserved) для обнаружения зарезервированных путей в Windows.535536#### `PurePath.joinpath(*pathsegments)`537538Вызов этого метода эквивалентен последовательному объединению пути с каждым из указанных *pathsegments*:539540```python541>>> PurePosixPath('/etc').joinpath('passwd')542PurePosixPath('/etc/passwd')543>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))544PurePosixPath('/etc/passwd')545>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')546PurePosixPath('/etc/init.d/apache2')547>>> PureWindowsPath('c:').joinpath('/Program Files')548PureWindowsPath('c:/Program Files')549```550551#### `PurePath.full_match(pattern, *, case_sensitive=None)`552553Сопоставляет этот путь с переданным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`. Например:554555```python556>>> PurePath('a/b.py').full_match('a/*.py')557True558>>> PurePath('a/b.py').full_match('*.py')559False560>>> PurePath('/a/b/c.py').full_match('/a/**')561True562>>> PurePath('/a/b/c.py').full_match('**/*.py')563True564```565566> **См. также**567>568> [Синтаксис шаблонов](https://python-all.ru/3.13/library/pathlib.html#pathlib-pattern-language) документации.569570Как и в других методах, чувствительность к регистру определяется по умолчанию платформой:571572```python573>>> PurePosixPath('b.py').full_match('*.PY')574False575>>> PureWindowsPath('b.py').full_match('*.PY')576True577```578579Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.580581Добавлено в версии 3.13.582583#### `PurePath.match(pattern, *, case_sensitive=None)`584585Сопоставляет этот путь с переданным нерекурсивным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`.586587Этот метод похож на [`full_match()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.full_match), но пустые шаблоны не допускаются (вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError)), рекурсивный шаблон «`**`» не поддерживается (он работает как нерекурсивный «`*`»), и если задан относительный шаблон, сравнение выполняется справа:588589```python590>>> PurePath('a/b.py').match('*.py')591True592>>> PurePath('/a/b/c.py').match('b/*.py')593True594>>> PurePath('/a/b/c.py').match('a/*.py')595False596```597598Изменено в версии 3.12: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).599600Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.601602#### `PurePath.relative_to(other, walk_up=False)`603604Вычисляет версию этого пути, относительную пути, представленному *other*. Если это невозможно, вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError):605606```python607>>> p = PurePosixPath('/etc/passwd')608>>> p.relative_to('/')609PurePosixPath('etc/passwd')610>>> p.relative_to('/etc')611PurePosixPath('passwd')612>>> p.relative_to('/usr')613Traceback (most recent call last):614 File "<stdin>", line 1, in <module>615 File "pathlib.py", line 941, in relative_to616 raise ValueError(error_message.format(str(self), str(formatted)))617ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.618```619620Когда *walk\_up* равно false (по умолчанию), путь должен начинаться с *other*. Когда аргумент true, могут быть добавлены элементы `..` для формирования относительного пути. Во всех остальных случаях, например, когда пути ссылаются на разные диски, вызывается [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError):621622```python623>>> p.relative_to('/usr', walk_up=True)624PurePosixPath('../etc/passwd')625>>> p.relative_to('foo', walk_up=True)626Traceback (most recent call last):627 File "<stdin>", line 1, in <module>628 File "pathlib.py", line 941, in relative_to629 raise ValueError(error_message.format(str(self), str(formatted)))630ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.631```632633> **Предупреждение**634>635> Эта функция является частью [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath) и работает со строками. Она не проверяет и не обращается к нижележащей файловой структуре. Это может повлиять на опцию *walk\_up*, так как предполагается, что в пути нет символических ссылок; при необходимости сначала вызовите [`resolve()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.resolve) для разрешения символьных ссылок.636637Изменено в версии 3.12: Добавлен параметр *walk\_up* (старое поведение эквивалентно `walk_up=False`).638639Устарело с версии 3.12, будет удалено в версии 3.14: Передача дополнительных позиционных аргументов устарела; если они указаны, они объединяются с *other*.640641#### `PurePath.with_name(name)`642643Возвращает новый путь с изменённым [`name`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.name). Если у исходного пути нет имени, вызывается ValueError:644645```python646>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')647>>> p.with_name('setup.py')648PureWindowsPath('c:/Downloads/setup.py')649>>> p = PureWindowsPath('c:/')650>>> p.with_name('setup.py')651Traceback (most recent call last):652 File "<stdin>", line 1, in <module>653 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name654 raise ValueError("%r has an empty name" % (self,))655ValueError: PureWindowsPath('c:/') has an empty name656```657658#### `PurePath.with_stem(stem)`659660Возвращает новый путь с изменённым [`stem`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.stem). Если у исходного пути нет имени, вызывается ValueError:661662```python663>>> p = PureWindowsPath('c:/Downloads/draft.txt')664>>> p.with_stem('final')665PureWindowsPath('c:/Downloads/final.txt')666>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')667>>> p.with_stem('lib')668PureWindowsPath('c:/Downloads/lib.gz')669>>> p = PureWindowsPath('c:/')670>>> p.with_stem('')671Traceback (most recent call last):672 File "<stdin>", line 1, in <module>673 File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem674 return self.with_name(stem + self.suffix)675 File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name676 raise ValueError("%r has an empty name" % (self,))677ValueError: PureWindowsPath('c:/') has an empty name678```679680Добавлено в версии 3.9.681682#### `PurePath.with_suffix(suffix)`683684Возвращает новый путь с изменённым [`suffix`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.suffix). Если у исходного пути нет суффикса, вместо него добавляется новый *suffix*. Если *suffix* – пустая строка, исходный суффикс удаляется:685686```python687>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')688>>> p.with_suffix('.bz2')689PureWindowsPath('c:/Downloads/pathlib.tar.bz2')690>>> p = PureWindowsPath('README')691>>> p.with_suffix('.txt')692PureWindowsPath('README.txt')693>>> p = PureWindowsPath('README.txt')694>>> p.with_suffix('')695PureWindowsPath('README')696```697698#### `PurePath.with_segments(*pathsegments)`699700Создаёт новый объект пути того же типа, объединяя указанные *pathsegments*. Этот метод вызывается при создании производного пути, например из [`parent`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parent) и [`relative_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.relative_to). Подклассы могут переопределять этот метод для передачи информации производным путям, например:701702```python703from pathlib import PurePosixPath704705class MyPath(PurePosixPath):706 def __init__(self, *pathsegments, session_id):707 super().__init__(*pathsegments)708 self.session_id = session_id709710 def with_segments(self, *pathsegments):711 return type(self)(*pathsegments, session_id=self.session_id)712713etc = MyPath('/etc', session_id=42)714hosts = etc / 'hosts'715print(hosts.session_id) # 42716```717718Добавлено в версии 3.12.719720## Конкретные пути721722Конкретные пути – это подклассы чистых классов путей. В дополнение к операциям, предоставляемым последними, они также предоставляют методы для выполнения системных вызовов над объектами путей. Есть три способа создания конкретных путей:723724#### `class pathlib.Path(*pathsegments)`725726Подкласс [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath); этот класс представляет конкретные пути, соответствующие flavour данной файловой системы (при создании экземпляра создаётся либо [`PosixPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PosixPath), либо [`WindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.WindowsPath)):727728```python729>>> Path('setup.py')730PosixPath('setup.py')731```732733Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath).734735#### `class pathlib.PosixPath(*pathsegments)`736737Подкласс [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path) и [`PurePosixPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePosixPath); этот класс представляет конкретные пути для файловых систем, отличных от Windows:738739```python740>>> PosixPath('/etc/hosts')741PosixPath('/etc/hosts')742```743744Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath).745746Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation) в Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).747748#### `class pathlib.WindowsPath(*pathsegments)`749750Подкласс [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path) и [`PureWindowsPath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PureWindowsPath); этот класс представляет конкретные пути файловой системы Windows:751752```python753>>> WindowsPath('c:/', 'Users', 'Ximénez')754WindowsPath('c:/Users/Ximénez')755```756757Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath).758759Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation) на платформах, отличных от Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).760761Можно создать экземпляр только того flavour класса, который соответствует системе (использование системных вызовов для несовместимых flavour путей может привести к ошибкам или сбоям в приложении):762763```python764>>> import os765>>> os.name766'posix'767>>> Path('setup.py')768PosixPath('setup.py')769>>> PosixPath('setup.py')770PosixPath('setup.py')771>>> WindowsPath('setup.py')772Traceback (most recent call last):773 File "<stdin>", line 1, in <module>774 File "pathlib.py", line 798, in __new__775 % (cls.__name__,))776UnsupportedOperation: cannot instantiate 'WindowsPath' on your system777```778779Некоторые методы конкретных путей могут возбуждать [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError), если системный вызов завершается ошибкой (например, потому что путь не существует).780781### Разбор и генерация URI782783Объекты конкретных путей можно создавать из URI вида «file» и представлять в виде URI, соответствующих [**RFC 8089**](https://python-all.ru/3.13/library/pathlib.html).784785> **Примечание**786>787> URI файлов не переносимы между машинами с разными [кодировками файловой системы](https://python-all.ru/3.13/library/os.html#filesystem-encoding).788789#### `classmethod Path.from_uri(uri)`790791Возвращает новый объект пути из разбора URI вида «file». Например:792793```python794>>> p = Path.from_uri('file:///etc/hosts')795PosixPath('/etc/hosts')796```797798В Windows пути устройств DOS и UNC могут быть получены разбором URI:799800```python801>>> p = Path.from_uri('file:///c:/windows')802WindowsPath('c:/windows')803>>> p = Path.from_uri('file://server/share')804WindowsPath('//server/share')805```806807Поддерживается несколько вариантов:808809```python810>>> p = Path.from_uri('file:////server/share')811WindowsPath('//server/share')812>>> p = Path.from_uri('file://///server/share')813WindowsPath('//server/share')814>>> p = Path.from_uri('file:c:/windows')815WindowsPath('c:/windows')816>>> p = Path.from_uri('file:/c|/windows')817WindowsPath('c:/windows')818```819820[`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) возбуждается, если URI не начинается с `file:`, или извлечённый путь не является абсолютным.821822Добавлено в версии 3.13.823824#### `Path.as_uri()`825826Представляет путь в виде URI «file». [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError) возбуждается, если путь не является абсолютным.827828```pycon829>>> p = PosixPath('/etc/passwd')830>>> p.as_uri()831'file:///etc/passwd'832>>> p = WindowsPath('c:/Windows')833>>> p.as_uri()834'file:///c:/Windows'835```836837По историческим причинам этот метод также доступен из объектов [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath). Однако использование [`os.fsencode()`](https://python-all.ru/3.13/library/os.html#os.fsencode) делает его строго нечистым.838839### Расширение и разрешение путей840841#### `classmethod Path.home()`842843Возвращает новый объект пути, представляющий домашний каталог пользователя (как возвращается [`os.path.expanduser()`](https://python-all.ru/3.13/library/os.path.html#os.path.expanduser) с конструкцией `~`). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.13/library/exceptions.html#RuntimeError).844845```python846>>> Path.home()847PosixPath('/home/antoine')848```849850Добавлено в версии 3.5.851852#### `Path.expanduser()`853854Возвращает новый путь с развёрнутыми конструкциями `~` и `~user`, как возвращается [`os.path.expanduser()`](https://python-all.ru/3.13/library/os.path.html#os.path.expanduser). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.13/library/exceptions.html#RuntimeError).855856```python857>>> p = PosixPath('~/films/Monty Python')858>>> p.expanduser()859PosixPath('/home/eric/films/Monty Python')860```861862Добавлено в версии 3.5.863864#### `classmethod Path.cwd()`865866Возвращает новый объект пути, представляющий текущий каталог (как возвращается [`os.getcwd()`](https://python-all.ru/3.13/library/os.html#os.getcwd)):867868```python869>>> Path.cwd()870PosixPath('/home/antoine/pathlib')871```872873#### `Path.absolute()`874875Делает путь абсолютным, без нормализации или разрешения симлинков. Возвращает новый объект path:876877```python878>>> p = Path('tests')879>>> p880PosixPath('tests')881>>> p.absolute()882PosixPath('/home/antoine/pathlib/tests')883```884885#### `Path.resolve(strict=False)`886887Делает путь абсолютным, разрешая все символические ссылки. Возвращается новый объект пути:888889```python890>>> p = Path()891>>> p892PosixPath('.')893>>> p.resolve()894PosixPath('/home/antoine/pathlib')895```896897“`..`” компоненты также удаляются (это единственный метод, который это делает):898899```python900>>> p = Path('docs/../setup.py')901>>> p.resolve()902PosixPath('/home/antoine/pathlib/setup.py')903```904905Если путь не существует или обнаружен зацикленный симлинк, а *strict* равен `True`, возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError). Если *strict* равен `False`, путь разрешается насколько возможно, а остаток добавляется без проверки его существования.906907Изменено в версии 3.6: Добавлен параметр *strict* (поведение до версии 3.6 – строгое).908909Изменено в версии 3.13: Зацикленные симлинки обрабатываются как другие ошибки: в строгом режиме возбуждается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError), а в нестрогом – исключение не возбуждается. В предыдущих версиях [`RuntimeError`](https://python-all.ru/3.13/library/exceptions.html#RuntimeError) возбуждалось независимо от значения *strict*.910911#### `Path.readlink()`912913Возвращает путь, на который указывает симлинк (как возвращается [`os.readlink()`](https://python-all.ru/3.13/library/os.html#os.readlink)):914915```python916>>> p = Path('mylink')917>>> p.symlink_to('setup.py')918>>> p.readlink()919PosixPath('setup.py')920```921922Добавлено в версии 3.9.923924Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.readlink()`](https://python-all.ru/3.13/library/os.html#os.readlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).925926### Запрос типа файла и статуса927928Изменено в версии 3.8: Методы [`exists()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.exists), [`is_dir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_file), [`is_mount()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_mount), [`is_symlink()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_symlink), [`is_block_device()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_block_device), [`is_char_device()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_char_device), [`is_fifo()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_fifo), [`is_socket()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_socket) теперь возвращают `False` вместо возбуждения исключения для путей, содержащих символы, непредставимые на уровне ОС.929930#### `Path.stat(*, follow_symlinks=True)`931932Возвращает объект [`os.stat_result`](https://python-all.ru/3.13/library/os.html#os.stat_result), содержащий информацию об этом пути, как [`os.stat()`](https://python-all.ru/3.13/library/os.html#os.stat). Результат запрашивается при каждом вызове этого метода.933934Этот метод обычно следует по симлинкам; чтобы выполнить stat для самого симлинка, добавьте аргумент `follow_symlinks=False`, или используйте [`lstat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.lstat).935936```python937>>> p = Path('setup.py')938>>> p.stat().st_size939956940>>> p.stat().st_mtime9411327883547.852554942```943944Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.945946#### `Path.lstat()`947948Как [`Path.stat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.stat), но если путь указывает на симлинк, возвращает информацию о симлинке, а не о его цели.949950#### `Path.exists(*, follow_symlinks=True)`951952Возвращает `True`, если путь указывает на существующий файл или каталог.953954Этот метод обычно следует по симлинкам; чтобы проверить существование симлинка, добавьте аргумент `follow_symlinks=False`.955956```python957>>> Path('.').exists()958True959>>> Path('setup.py').exists()960True961>>> Path('/etc').exists()962True963>>> Path('nonexistentfile').exists()964False965```966967Изменено в версии 3.12: Добавлен параметр *follow\_symlinks*.968969#### `Path.is_file(*, follow_symlinks=True)`970971Возвращает `True`, если путь указывает на обычный файл, `False` если он указывает на файл другого типа.972973`False` также возвращается, если путь не существует или является битой символической ссылкой; другие ошибки (например, ошибки прав доступа) передаются дальше.974975Этот метод обычно следует по симлинкам; чтобы исключить симлинки, добавьте аргумент `follow_symlinks=False`.976977Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.978979#### `Path.is_dir(*, follow_symlinks=True)`980981Возвращает `True`, если путь указывает на каталог, `False` если он указывает на файл другого типа.982983`False` также возвращается, если путь не существует или является битой символической ссылкой; другие ошибки (например, ошибки прав доступа) передаются дальше.984985Этот метод обычно следует по симлинкам; чтобы исключить симлинки на каталоги, добавьте аргумент `follow_symlinks=False`.986987Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.988989#### `Path.is_symlink()`990991Возвращает `True`, если путь указывает на символическую ссылку, иначе `False`.992993`False` также возвращается, если путь не существует; другие ошибки (например, ошибки прав доступа) передаются дальше.994995#### `Path.is_junction()`996997Возвращает `True`, если путь указывает на junction, и `False` для любого другого типа файла. В настоящее время только Windows поддерживает junctions.998999Добавлено в версии 3.12.10001001#### `Path.is_mount()`10021003Возвращает `True`, если путь является *точкой монтирования*: точка в файловой системе, куда смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог *path*, `path/..`, на другом устройстве, чем *path*, или указывают ли `path/..` и *path* на один и тот же i-node на одном и том же устройстве – это должно определять точки монтирования для всех вариантов Unix и POSIX. В Windows точкой монтирования считается корень диска (например, `c:\`), общая папка UNC (например, `\\server\share`) или смонтированная директория файловой системы.10041005Добавлено в версии 3.7.10061007Изменено в версии 3.12: Добавлена поддержка Windows.10081009#### `Path.is_socket()`10101011Возвращает `True`, если путь указывает на сокет Unix (или на символическую ссылку, указывающую на сокет Unix), `False` если он указывает на файл другого типа.10121013`False` также возвращается, если путь не существует или является битой символической ссылкой; другие ошибки (например, ошибки прав доступа) передаются дальше.10141015#### `Path.is_fifo()`10161017Возвращает `True`, если путь указывает на FIFO (или на символическую ссылку, указывающую на FIFO), `False` если он указывает на файл другого типа.10181019`False` также возвращается, если путь не существует или является битой символической ссылкой; другие ошибки (например, ошибки прав доступа) передаются дальше.10201021#### `Path.is_block_device()`10221023Возвращает `True`, если путь указывает на блочное устройство (или на символическую ссылку, указывающую на блочное устройство), `False` если он указывает на файл другого типа.10241025`False` также возвращается, если путь не существует или является битой символической ссылкой; другие ошибки (например, ошибки прав доступа) передаются дальше.10261027#### `Path.is_char_device()`10281029Возвращает `True`, если путь указывает на символьное устройство (или на символическую ссылку, указывающую на символьное устройство), `False` если он указывает на файл другого типа.10301031`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.10321033#### `Path.samefile(other_path)`10341035Возвращает, указывает ли этот путь на тот же файл, что и *other\_path*, который может быть как объектом Path, так и строкой. Семантика аналогична [`os.path.samefile()`](https://python-all.ru/3.13/library/os.path.html#os.path.samefile) и [`os.path.samestat()`](https://python-all.ru/3.13/library/os.path.html#os.path.samestat).10361037Исключение [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError) может быть возбуждено, если какой-либо из файлов недоступен по какой-либо причине.10381039```python1040>>> p = Path('spam')1041>>> q = Path('eggs')1042>>> p.samefile(q)1043False1044>>> p.samefile('spam')1045True1046```10471048Добавлено в версии 3.5.10491050### Чтение и запись файлов10511052#### `Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)`10531054Открывает файл, на который указывает путь, как это делает встроенная функция [`open()`](https://python-all.ru/3.13/library/functions.html#open) :10551056```python1057>>> p = Path('setup.py')1058>>> with p.open() as f:1059... f.readline()1060...1061'#!/usr/bin/env python3\n'1062```10631064#### `Path.read_text(encoding=None, errors=None, newline=None)`10651066Возвращает декодированное содержимое файла, на который указывает путь, в виде строки:10671068```python1069>>> p = Path('my_text_file')1070>>> p.write_text('Text file contents')1071181072>>> p.read_text()1073'Text file contents'1074```10751076Файл открывается, а затем закрывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.13/library/functions.html#open).10771078Добавлено в версии 3.5.10791080Изменено в версии 3.13: Добавлен параметр *newline*.10811082#### `Path.read_bytes()`10831084Возвращает двоичное содержимое файла, на который указывает путь, в виде объекта bytes:10851086```python1087>>> p = Path('my_binary_file')1088>>> p.write_bytes(b'Binary file contents')1089201090>>> p.read_bytes()1091b'Binary file contents'1092```10931094Добавлено в версии 3.5.10951096#### `Path.write_text(data, encoding=None, errors=None, newline=None)`10971098Открывает файл в текстовом режиме, записывает в него *data* и закрывает файл:10991100```python1101>>> p = Path('my_text_file')1102>>> p.write_text('Text file contents')1103181104>>> p.read_text()1105'Text file contents'1106```11071108Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.13/library/functions.html#open).11091110Добавлено в версии 3.5.11111112Изменено в версии 3.10: Добавлен параметр *newline*.11131114#### `Path.write_bytes(data)`11151116Открывает файл в байтовом режиме, записывает в него *data* и закрывает файл:11171118```python1119>>> p = Path('my_binary_file')1120>>> p.write_bytes(b'Binary file contents')1121201122>>> p.read_bytes()1123b'Binary file contents'1124```11251126Существующий файл с таким же именем перезаписывается.11271128Добавлено в версии 3.5.11291130### Чтение каталогов11311132#### `Path.iterdir()`11331134Если путь указывает на каталог, возвращает объекты пути для его содержимого:11351136```python1137>>> p = Path('docs')1138>>> for child in p.iterdir(): child1139...1140PosixPath('docs/conf.py')1141PosixPath('docs/_templates')1142PosixPath('docs/make.bat')1143PosixPath('docs/index.rst')1144PosixPath('docs/_build')1145PosixPath('docs/_static')1146PosixPath('docs/Makefile')1147```11481149Дочерние элементы возвращаются в произвольном порядке, а специальные записи `'.'` и `'..'` не включаются. Если файл удаляется или добавляется в каталог после создания итератора, то не определено, будет ли включен объект пути для этого файла.11501151Если путь не является каталогом или недоступен по другой причине, вызывается [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError).11521153#### `Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False)`11541155Выполняет поиск по заданному относительному *pattern* в каталоге, представленном этим путем, возвращая все совпадающие файлы (любого типа):11561157```python1158>>> sorted(Path('.').glob('*.py'))1159[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]1160>>> sorted(Path('.').glob('*/*.py'))1161[PosixPath('docs/conf.py')]1162>>> sorted(Path('.').glob('**/*.py'))1163[PosixPath('build/lib/pathlib.py'),1164 PosixPath('docs/conf.py'),1165 PosixPath('pathlib.py'),1166 PosixPath('setup.py'),1167 PosixPath('test_pathlib.py')]1168```11691170> **Примечание**1171>1172> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.11731174> **См. также**1175>1176> [Синтаксис шаблонов](https://python-all.ru/3.13/library/pathlib.html#pathlib-pattern-language) документации.11771178По умолчанию, или когда аргумент *case\_sensitive* (только по имени) установлен в `None`, этот метод сопоставляет пути с учетом правил регистра, специфичных для платформы: обычно с учетом регистра на POSIX и без учета регистра на Windows. Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.11791180По умолчанию, или когда аргумент *recurse\_symlinks* (только по имени) установлен в `False`, этот метод переходит по символическим ссылкам, за исключением случаев раскрытия подстановочных знаков «`**`». Установите *recurse\_symlinks* в `True`, чтобы всегда следовать по символьным ссылкам.11811182> **Примечание**1183>1184> Все исключения [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.13/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.11851186Возбуждает [событие аудита](https://python-all.ru/3.13/library/sys.html#auditing) `pathlib.Path.glob` с аргументами `self`, `pattern`.11871188Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.11891190Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.11911192Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).11931194Изменено в версии 3.13: Любые исключения [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. В предыдущих версиях такие исключения подавлялись во многих, но не во всех случаях.11951196#### `Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False)`11971198Выполняет рекурсивный поиск по заданному относительному *pattern*. Это аналогично вызову [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) с добавлением «`**/`» перед *pattern*.11991200> **Примечание**1201>1202> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.12031204> **Примечание**1205>1206> Все исключения [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.13/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.12071208> **См. также**1209>1210> [Синтаксис шаблонов](https://python-all.ru/3.13/library/pathlib.html#pathlib-pattern-language) и документация [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob).12111212Возбуждает [событие аудита](https://python-all.ru/3.13/library/sys.html#auditing) `pathlib.Path.rglob` с аргументами `self`, `pattern`.12131214Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.12151216Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.12171218Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.13/glossary.html#term-path-like-object).12191220#### `Path.walk(top_down=True, on_error=None, follow_symlinks=False)`12211222Генерирует имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх.12231224Для каждого каталога в дереве каталогов с корнем *self* (включая *self*, но исключая '.' и '..'), метод возвращает кортеж из 3 элементов: `(dirpath, dirnames, filenames)`.12251226*dirpath* – это [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path) к текущему обходимому каталогу, *dirnames* – список строк с именами подкаталогов в *dirpath* (исключая `'.'` и `'..'`), а *filenames* – список строк с именами файлов (не каталогов) в *dirpath*. Чтобы получить полный путь (начинающийся с *self*) к файлу или каталогу в *dirpath*, используйте `dirpath / name`. Отсортированы ли списки, зависит от файловой системы.12271228Если необязательный аргумент *top\_down* равен true (по умолчанию), тройка для каталога генерируется до троек для любых его подкаталогов (каталоги обходятся сверху вниз). Если *top\_down* равен false, тройка для каталога генерируется после троек для всех его подкаталогов (каталоги обходятся снизу вверх). Независимо от значения *top\_down*, список подкаталогов извлекается до того, как будут обойдены тройки для каталога и его подкаталогов.12291230Когда *top\_down* равен true, вызывающий код может изменить список *dirnames* на месте (например, с помощью [`del`](https://python-all.ru/3.13/reference/simple_stmts.html#del) или присваивания среза), и `Path.walk()` будет рекурсивно обходить только те подкаталоги, чьи имена остались в *dirnames*. Это можно использовать для обрезки поиска, наложения определённого порядка обхода или даже для информирования `Path.walk()` о каталогах, которые вызывающий код создаёт или переименовывает до того, как возобновит `Path.walk()` снова. Изменение *dirnames*, когда *top\_down* равен false, не влияет на поведение `Path.walk()`, поскольку каталоги в *dirnames* уже были сгенерированы к моменту, когда *dirnames* передаётся вызывающему коду.12311232По умолчанию ошибки [`os.scandir()`](https://python-all.ru/3.13/library/os.html#os.scandir) игнорируются. Если указан необязательный аргумент *on\_error*, это должен быть вызываемый объект; он будет вызван с одним аргументом – экземпляром [`OSError`](https://python-all.ru/3.13/library/exceptions.html#OSError). Этот вызываемый объект может обработать ошибку, чтобы продолжить обход, или повторно возбудить её, чтобы остановить обход. Обратите внимание: имя файла доступно как атрибут `filename` объекта исключения.12331234По умолчанию `Path.walk()` не переходит по символическим ссылкам, а вместо этого добавляет их в список *filenames*. Установите *follow\_symlinks* в true, чтобы разрешать символические ссылки и помещать их в *dirnames* и *filenames* в соответствии с их целями, и, таким образом, обходить каталоги, на которые указывают символические ссылки (если это поддерживается).12351236> **Примечание**1237>1238> Имейте в виду, что установка *follow\_symlinks* в true может привести к бесконечной рекурсии, если ссылка указывает на родительский каталог самой себя. `Path.walk()` не отслеживает уже посещённые каталоги.12391240> **Примечание**1241>1242> `Path.walk()` предполагает, что обходимые им каталоги не изменяются во время выполнения. Например, если каталог из *dirnames* был заменён символической ссылкой, а *follow\_symlinks* равно false, `Path.walk()` всё равно попытается спуститься в него. Чтобы предотвратить такое поведение, удаляйте каталоги из *dirnames* по мере необходимости.12431244> **Примечание**1245>1246> В отличие от [`os.walk()`](https://python-all.ru/3.13/library/os.html#os.walk), `Path.walk()` перечисляет символические ссылки на каталоги в *filenames*, если *follow\_symlinks* равно false.12471248Этот пример показывает количество байтов, используемых всеми файлами в каждом каталоге, игнорируя каталоги `__pycache__`:12491250```python1251from pathlib import Path1252for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):1253 print(1254 root,1255 "consumes",1256 sum((root / file).stat().st_size for file in files),1257 "bytes in",1258 len(files),1259 "non-directory files"1260 )1261 if '__pycache__' in dirs:1262 dirs.remove('__pycache__')1263```12641265Следующий пример – простая реализация [`shutil.rmtree()`](https://python-all.ru/3.13/library/shutil.html#shutil.rmtree). Обход дерева снизу вверх необходим, поскольку [`rmdir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rmdir) не позволяет удалить каталог, пока он не пуст:12661267```python1268# Удалить всё, доступное из каталога "top".1269# ВНИМАНИЕ: Это опасно! Например, если top == Path('/'),1270# это может удалить все файлы.1271for root, dirs, files in top.walk(top_down=False):1272 for name in files:1273 (root / name).unlink()1274 for name in dirs:1275 (root / name).rmdir()1276```12771278Добавлено в версии 3.12.12791280### Создание файлов и каталогов12811282#### `Path.touch(mode=0o666, exist_ok=True)`12831284Создаёт файл по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если файл уже существует, функция завершается успешно, когда *exist\_ok* равен true (время модификации обновляется до текущего), в противном случае возбуждается [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError).12851286> **См. также**1287>1288> Методы [`open()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.open), [`write_text()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.write_text) и [`write_bytes()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.write_bytes) часто используются для создания файлов.12891290#### `Path.mkdir(mode=0o777, parents=False, exist_ok=False)`12911292Создаёт новый каталог по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если путь уже существует, возбуждается [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError).12931294Если *parents* равен true, любые отсутствующие родительские каталоги этого пути создаются по мере необходимости; они создаются с правами по умолчанию без учёта *mode* (имитируя команду POSIX `mkdir -p`).12951296Если *parents* равен false (по умолчанию), отсутствие родительского каталога вызывает [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError).12971298Если *exist\_ok* равен false (по умолчанию), [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError) возбуждается, если целевой каталог уже существует.12991300Если *exist\_ok* равен true, [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError) не будет возбуждаться, за исключением случая, когда указанный путь уже существует в файловой системе и не является каталогом (аналогично поведению команды POSIX `mkdir -p`).13011302Изменено в версии 3.5: Добавлен параметр *exist\_ok*.13031304#### `Path.symlink_to(target, target_is_directory=False)`13051306Делает этот путь символической ссылкой, указывающей на *target*.13071308В Windows символическая ссылка представляет собой файл или каталог и не изменяется динамически в соответствии с целью. Если цель существует, тип ссылки будет создан соответствующим. В противном случае ссылка будет создана как каталог, если *target\_is\_directory* равен true, или как файловая ссылка (по умолчанию) в противном случае. На платформах, отличных от Windows, *target\_is\_directory* игнорируется.13091310```python1311>>> p = Path('mylink')1312>>> p.symlink_to('setup.py')1313>>> p.resolve()1314PosixPath('/home/antoine/pathlib/setup.py')1315>>> p.stat().st_size13169561317>>> p.lstat().st_size131881319```13201321> **Примечание**1322>1323> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.symlink()`](https://python-all.ru/3.13/library/os.html#os.symlink).13241325Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.symlink()`](https://python-all.ru/3.13/library/os.html#os.symlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).13261327#### `Path.hardlink_to(target)`13281329Делает этот путь жёсткой ссылкой на тот же файл, что и *target*.13301331> **Примечание**1332>1333> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.link()`](https://python-all.ru/3.13/library/os.html#os.link).13341335Добавлено в версии 3.10.13361337Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.link()`](https://python-all.ru/3.13/library/os.html#os.link) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).13381339### Переименование и удаление13401341#### `Path.rename(target)`13421343Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. В Unix, если *target* существует и является файлом, он будет молча заменён, если у пользователя есть разрешение. В Windows, если *target* существует, будет вызвано [`FileExistsError`](https://python-all.ru/3.13/library/exceptions.html#FileExistsError). *target* может быть строкой или другим объектом пути.13441345```python1346>>> p = Path('foo')1347>>> p.open('w').write('some text')134891349>>> target = Path('bar')1350>>> p.rename(target)1351PosixPath('bar')1352>>> target.open().read()1353'some text'1354```13551356Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.13571358Реализован через [`os.rename()`](https://python-all.ru/3.13/library/os.html#os.rename) и даёт те же гарантии.13591360Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.13611362#### `Path.replace(target)`13631364Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. Если *target* указывает на существующий файл или пустой каталог, он будет безусловно заменён.13651366Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.13671368Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.13691370#### `Path.unlink(missing_ok=False)`13711372Удаляет этот файл или символическую ссылку. Если путь указывает на каталог, используйте [`Path.rmdir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rmdir).13731374Если *missing\_ok* равно false (по умолчанию), [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError) вызывается, если путь не существует.13751376Если *missing\_ok* равно true, исключения [`FileNotFoundError`](https://python-all.ru/3.13/library/exceptions.html#FileNotFoundError) будут игнорироваться (аналогично поведению команды POSIX `rm -f`).13771378Изменено в версии 3.8: Добавлен параметр *missing\_ok*.13791380#### `Path.rmdir()`13811382Удаляет этот каталог. Каталог должен быть пустым.13831384### Права доступа и владение13851386#### `Path.owner(*, follow_symlinks=True)`13871388Возвращает имя пользователя, владеющего файлом. [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) вызывается, если идентификатор пользователя (UID) файла не найден в системной базе данных.13891390Этот метод обычно следует символическим ссылкам; чтобы получить владельца самой символической ссылки, добавьте аргумент `follow_symlinks=False`.13911392Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`pwd`](https://python-all.ru/3.13/library/pwd.html#module-pwd) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).13931394Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.13951396#### `Path.group(*, follow_symlinks=True)`13971398Возвращает имя группы, владеющей файлом. [`KeyError`](https://python-all.ru/3.13/library/exceptions.html#KeyError) возбуждается, если идентификатор группы (GID) файла не найден в системной базе данных.13991400Этот метод обычно переходит по символьным ссылкам. Для получения группы самой символьной ссылки используется аргумент `follow_symlinks=False`.14011402Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.13/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`grp`](https://python-all.ru/3.13/library/grp.html#module-grp) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.13/library/exceptions.html#NotImplementedError).14031404Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.14051406#### `Path.chmod(mode, *, follow_symlinks=True)`14071408Изменяет режим и права доступа к файлу, как [`os.chmod()`](https://python-all.ru/3.13/library/os.html#os.chmod).14091410Этот метод обычно переходит по символьным ссылкам. Некоторые варианты Unix поддерживают изменение прав доступа на самой символьной ссылке; на таких платформах можно добавить аргумент `follow_symlinks=False` или использовать [`lchmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.lchmod).14111412```python1413>>> p = Path('setup.py')1414>>> p.stat().st_mode1415332771416>>> p.chmod(0o444)1417>>> p.stat().st_mode1418330601419```14201421Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.14221423#### `Path.lchmod(mode)`14241425Как [`Path.chmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.chmod), но если путь указывает на символьную ссылку, то изменяется режим самой символьной ссылки, а не её цели.14261427## Язык шаблонов14281429В шаблонах для [`full_match()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.full_match), [`glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rglob) поддерживаются следующие подстановочные знаки:14301431**`**` (весь сегмент)**14321433Соответствует любому количеству сегментов файлов или каталогов, включая ноль.14341435**`*` (весь сегмент)**14361437Соответствует одному сегменту файла или каталога.14381439**`*` (часть сегмента)**14401441Соответствует любому количеству символов, не являющихся разделителями, включая ноль.14421443**`?`**14441445Соответствует одному символу, не являющемуся разделителем.14461447**`[seq]`**14481449Соответствует одному символу из *seq*, где *seq* – это последовательность символов. Поддерживаются диапазонные выражения; например, `[a-z]` соответствует любой строчной букве ASCII. Можно комбинировать несколько диапазонов: `[a-zA-Z0-9_]` соответствует любой букве ASCII, цифре или знаку подчеркивания.14501451**`[!seq]`**14521453Соответствует одному символу, не входящему в *seq*, где правила для *seq* такие же, как выше.14541455Для точного совпадения заключите метасимволы в скобки. Например, `"[?]"` соответствует символу `"?"`.14561457Подстановочный знак «`**`» включает рекурсивный поиск по шаблону. Несколько примеров:14581459| Шаблон | Значение |1460| --- | --- |1461| “`**/*`” | Любой путь, содержащий хотя бы один сегмент. |1462| “`**/*.py`” | Любой путь, последний сегмент которого заканчивается на «`.py`». |1463| “`assets/**`” | Любой путь, начинающийся с «`assets/`». |1464| “`assets/**/*`” | Любой путь, начинающийся с «`assets/`», за исключением самого «`assets/`». |14651466> **Примечание**1467>1468> Поиск по шаблону с использованием подстановочного знака «`**`» проходит по каждому каталогу в дереве. Большие деревья каталогов могут требовать много времени на поиск.14691470Изменено в версии 3.13: Поиск по шаблону, оканчивающемуся на «`**`», возвращает как файлы, так и каталоги. В предыдущих версиях возвращались только каталоги.14711472В [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rglob) к шаблону может быть добавлена конечная косая черта для соответствия только каталогам.14731474Изменено в версии 3.11: Поиск по шаблону, оканчивающемуся на разделитель компонентов пути ([`sep`](https://python-all.ru/3.13/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.13/library/os.html#os.altsep)), возвращает только каталоги.14751476## Сравнение с модулем [`glob`](https://python-all.ru/3.13/library/glob.html#module-glob)14771478Шаблоны, принимаемые [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rglob), и генерируемые ими результаты немного отличаются от результатов модуля [`glob`](https://python-all.ru/3.13/library/glob.html#module-glob):147914801. Файлы, начинающиеся с точки, не являются особыми в pathlib. Это аналогично передаче `include_hidden=True` в [`glob.glob()`](https://python-all.ru/3.13/library/glob.html#glob.glob).14812. Компоненты шаблона «`**`» в pathlib всегда рекурсивны. Это аналогично передаче `recursive=True` в [`glob.glob()`](https://python-all.ru/3.13/library/glob.html#glob.glob).14823. Компоненты шаблона «`**`» по умолчанию не переходят по символическим ссылкам в pathlib. Это поведение не имеет аналога в [`glob.glob()`](https://python-all.ru/3.13/library/glob.html#glob.glob), но можно передать `recurse_symlinks=True` в [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) для совместимого поведения.14834. Как и все объекты [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path), значения, возвращаемые из [`Path.glob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rglob), не содержат завершающих слешей.14845. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, включают *путь* в качестве префикса, в отличие от результатов `glob.glob(root_dir=path)`.14856. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, могут включать сам *путь*, например, при поиске по шаблону «`**`», тогда как результаты `glob.glob(root_dir=path)` никогда не включают пустую строку, которая соответствовала бы *пути*.14861487## Сравнение с модулями [`os`](https://python-all.ru/3.13/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path)14881489pathlib реализует операции с путями, используя объекты [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path), и поэтому считается *объектно-ориентированным*. С другой стороны, модули [`os`](https://python-all.ru/3.13/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path) предоставляют функции, работающие с низкоуровневыми объектами `str` и `bytes`, что является более *процедурным* подходом. Некоторые пользователи считают объектно-ориентированный стиль более читаемым.14901491Многие функции в [`os`](https://python-all.ru/3.13/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path) поддерживают пути `bytes` и [пути, относительные относительно дескрипторов каталогов](https://python-all.ru/3.13/library/os.html#dir-fd). Эти возможности недоступны в pathlib.14921493Типы `str` и `bytes`, а также части модулей [`os`](https://python-all.ru/3.13/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path), написаны на C и очень быстры. pathlib написан на чистом Python и обычно работает медленнее, но редко настолько, чтобы это было существенно.14941495Нормализация путей в pathlib немного более строгая и последовательная, чем в [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path). Например, тогда как [`os.path.abspath()`](https://python-all.ru/3.13/library/os.path.html#os.path.abspath) удаляет сегменты «`..`» из пути, что может изменить его значение при наличии символических ссылок, [`Path.absolute()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.absolute) сохраняет эти сегменты для большей безопасности.14961497Нормализация путей в pathlib может сделать её непригодной для некоторых приложений:149814991. pathlib нормализует `Path("my_folder/")` в `Path("my_folder")`, что меняет значение пути при передаче в различные API операционной системы и командной строки. В частности, отсутствие завершающего разделителя может позволить разрешить путь как файл или каталог, а не только как каталог.15002. pathlib нормализует `Path("./my_program")` в `Path("my_program")`, что меняет значение пути при использовании в качестве пути поиска исполняемых файлов, например в оболочке или при порождении дочернего процесса. В частности, отсутствие разделителя в пути может заставить искать его в `PATH` вместо текущего каталога.15011502Вследствие этих различий pathlib не является прямой заменой для [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path).15031504### Соответствующие инструменты15051506Ниже представлена таблица, сопоставляющая различные функции [`os`](https://python-all.ru/3.13/library/os.html#module-os) с их эквивалентами в [`PurePath`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath)/[`Path`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path).15071508| [`os`](https://python-all.ru/3.13/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.13/library/os.path.html#module-os.path) | `pathlib` |1509| --- | --- |1510| [`os.path.dirname()`](https://python-all.ru/3.13/library/os.path.html#os.path.dirname) | [`PurePath.parent`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.parent) |1511| [`os.path.basename()`](https://python-all.ru/3.13/library/os.path.html#os.path.basename) | [`PurePath.name`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.name) |1512| [`os.path.splitext()`](https://python-all.ru/3.13/library/os.path.html#os.path.splitext) | [`PurePath.stem`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.stem), [`PurePath.suffix`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.suffix) |1513| [`os.path.join()`](https://python-all.ru/3.13/library/os.path.html#os.path.join) | [`PurePath.joinpath()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.joinpath) |1514| [`os.path.isabs()`](https://python-all.ru/3.13/library/os.path.html#os.path.isabs) | [`PurePath.is_absolute()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.is_absolute) |1515| [`os.path.relpath()`](https://python-all.ru/3.13/library/os.path.html#os.path.relpath) | [`PurePath.relative_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.relative_to) [\[1\]](https://python-all.ru/3.13/library/pathlib.html#id7) |1516| [`os.path.expanduser()`](https://python-all.ru/3.13/library/os.path.html#os.path.expanduser) | [`Path.expanduser()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.expanduser) [\[2\]](https://python-all.ru/3.13/library/pathlib.html#id8) |1517| [`os.path.realpath()`](https://python-all.ru/3.13/library/os.path.html#os.path.realpath) | [`Path.resolve()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.resolve) |1518| [`os.path.abspath()`](https://python-all.ru/3.13/library/os.path.html#os.path.abspath) | [`Path.absolute()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.absolute) [\[3\]](https://python-all.ru/3.13/library/pathlib.html#id9) |1519| [`os.path.exists()`](https://python-all.ru/3.13/library/os.path.html#os.path.exists) | [`Path.exists()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.exists) |1520| [`os.path.isfile()`](https://python-all.ru/3.13/library/os.path.html#os.path.isfile) | [`Path.is_file()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_file) |1521| [`os.path.isdir()`](https://python-all.ru/3.13/library/os.path.html#os.path.isdir) | [`Path.is_dir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_dir) |1522| [`os.path.islink()`](https://python-all.ru/3.13/library/os.path.html#os.path.islink) | [`Path.is_symlink()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_symlink) |1523| [`os.path.isjunction()`](https://python-all.ru/3.13/library/os.path.html#os.path.isjunction) | [`Path.is_junction()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_junction) |1524| [`os.path.ismount()`](https://python-all.ru/3.13/library/os.path.html#os.path.ismount) | [`Path.is_mount()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.is_mount) |1525| [`os.path.samefile()`](https://python-all.ru/3.13/library/os.path.html#os.path.samefile) | [`Path.samefile()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.samefile) |1526| [`os.getcwd()`](https://python-all.ru/3.13/library/os.html#os.getcwd) | [`Path.cwd()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.cwd) |1527| [`os.stat()`](https://python-all.ru/3.13/library/os.html#os.stat) | [`Path.stat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.stat) |1528| [`os.lstat()`](https://python-all.ru/3.13/library/os.html#os.lstat) | [`Path.lstat()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.lstat) |1529| [`os.listdir()`](https://python-all.ru/3.13/library/os.html#os.listdir) | [`Path.iterdir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.iterdir) |1530| [`os.walk()`](https://python-all.ru/3.13/library/os.html#os.walk) | [`Path.walk()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.walk) [\[4\]](https://python-all.ru/3.13/library/pathlib.html#id10) |1531| [`os.mkdir()`](https://python-all.ru/3.13/library/os.html#os.mkdir), [`os.makedirs()`](https://python-all.ru/3.13/library/os.html#os.makedirs) | [`Path.mkdir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.mkdir) |1532| [`os.link()`](https://python-all.ru/3.13/library/os.html#os.link) | [`Path.hardlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.hardlink_to) |1533| [`os.symlink()`](https://python-all.ru/3.13/library/os.html#os.symlink) | [`Path.symlink_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.symlink_to) |1534| [`os.readlink()`](https://python-all.ru/3.13/library/os.html#os.readlink) | [`Path.readlink()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.readlink) |1535| [`os.rename()`](https://python-all.ru/3.13/library/os.html#os.rename) | [`Path.rename()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rename) |1536| [`os.replace()`](https://python-all.ru/3.13/library/os.html#os.replace) | [`Path.replace()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.replace) |1537| [`os.remove()`](https://python-all.ru/3.13/library/os.html#os.remove), [`os.unlink()`](https://python-all.ru/3.13/library/os.html#os.unlink) | [`Path.unlink()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.unlink) |1538| [`os.rmdir()`](https://python-all.ru/3.13/library/os.html#os.rmdir) | [`Path.rmdir()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.rmdir) |1539| [`os.chmod()`](https://python-all.ru/3.13/library/os.html#os.chmod) | [`Path.chmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.chmod) |1540| [`os.lchmod()`](https://python-all.ru/3.13/library/os.html#os.lchmod) | [`Path.lchmod()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.lchmod) |15411542Сноски15431544\[[1](https://python-all.ru/3.13/library/pathlib.html#id3)\]15451546[`os.path.relpath()`](https://python-all.ru/3.13/library/os.path.html#os.path.relpath) вызывает [`abspath()`](https://python-all.ru/3.13/library/os.path.html#os.path.abspath), чтобы сделать пути абсолютными и удалить части «`..`», тогда как [`PurePath.relative_to()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.PurePath.relative_to) является лексической операцией, которая возбуждает [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError), когда якоря входных путей различаются (например, если один путь абсолютный, а другой относительный).15471548\[[2](https://python-all.ru/3.13/library/pathlib.html#id4)\]15491550[`os.path.expanduser()`](https://python-all.ru/3.13/library/os.path.html#os.path.expanduser) возвращает путь без изменений, если домашний каталог не может быть определён, тогда как [`Path.expanduser()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.expanduser) возбуждает [`RuntimeError`](https://python-all.ru/3.13/library/exceptions.html#RuntimeError).15511552\[[3](https://python-all.ru/3.13/library/pathlib.html#id5)\]15531554[`os.path.abspath()`](https://python-all.ru/3.13/library/os.path.html#os.path.abspath) удаляет компоненты «`..`» без разрешения символических ссылок, что может изменить значение пути, тогда как [`Path.absolute()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.absolute) оставляет любые компоненты «`..`» в пути.15551556\[[4](https://python-all.ru/3.13/library/pathlib.html#id6)\]15571558[`os.walk()`](https://python-all.ru/3.13/library/os.html#os.walk) всегда следует символьным ссылкам при разбиении путей на *имена каталогов* и *имена файлов*, тогда как [`Path.walk()`](https://python-all.ru/3.13/library/pathlib.html#pathlib.Path.walk) классифицирует все символьные ссылки как *имена файлов*, когда *follow\_symlinks* равен false (по умолчанию).1559