pathlib.md
1> **Источник:** https://python-all.ru/3.15/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.15/Lib/pathlib)1213---1415Этот модуль предоставляет классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на [чистые пути](https://python-all.ru/3.15/library/pathlib.html#pure-paths), которые выполняют только вычислительные операции без ввода-вывода, и [конкретные пути](https://python-all.ru/3.15/library/pathlib.html#concrete-paths), которые наследуют чистые пути, но также предоставляют операции ввода-вывода.16171819Если вы никогда не пользовались этим модулем раньше или просто не уверены, какой класс подходит для вашей задачи, скорее всего, вам нужен [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path). Он создаёт экземпляр [конкретного пути](https://python-all.ru/3.15/library/pathlib.html#concrete-paths) для платформы, на которой выполняется код.2021Чистые пути полезны в некоторых особых случаях; например:22231. Если требуется манипулировать путями Windows на машине Unix (или наоборот). При работе на Unix нельзя создать экземпляр [`WindowsPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.WindowsPath), но можно создать [`PureWindowsPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PureWindowsPath).242. Если нужно, чтобы код только манипулировал путями без фактического обращения к ОС. В таком случае может быть полезно создать экземпляр одного из чистых классов, поскольку они просто не имеют операций доступа к ОС.2526> **См. также**27>28> [**PEP 428**](https://python-all.ru/3.15/library/pathlib.html): модуль pathlib – объектно-ориентированные пути файловой системы.2930> **См. также**31>32> Для низкоуровневых манипуляций с путями в виде строк можно также использовать модуль [`os.path`](https://python-all.ru/3.15/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.15/library/exceptions.html#NotImplementedError), которое возбуждается при вызове неподдерживаемой операции над объектом пути.9394Добавлено в версии 3.13.9596## Чистые пути9798Объекты чистых путей предоставляют операции обработки путей, которые не обращаются к файловой системе. Существует три способа доступа к этим классам, которые также называются *разновидностями*:99100#### `class pathlib.PurePath(*pathsegments)`101102Общий класс, представляющий разновидность пути системы (при создании экземпляра создаётся либо [`PurePosixPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePosixPath), либо [`PureWindowsPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PureWindowsPath)):103104```python105>>> PurePath('setup.py') # Запуск на Unix-машине106PurePosixPath('setup.py')107```108109Каждый элемент *pathsegments* может быть либо строкой, представляющей сегмент пути, либо объектом, реализующим интерфейс [`os.PathLike`](https://python-all.ru/3.15/library/os.html#os.PathLike), где метод [`__fspath__()`](https://python-all.ru/3.15/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.15/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.15/library/os.html#os.PathLike), что позволяет использовать их везде, где этот интерфейс принимается.157158Изменено в версии 3.6: Добавлена поддержка интерфейса [`os.PathLike`](https://python-all.ru/3.15/library/os.html#os.PathLike).159160#### `class pathlib.PurePosixPath(*pathsegments)`161162Подкласс [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы, отличные от Windows:163164```python165>>> PurePosixPath('/etc/hosts')166PurePosixPath('/etc/hosts')167```168169Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath).170171#### `class pathlib.PureWindowsPath(*pathsegments)`172173Подкласс [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы Windows, включая [UNC-пути](https://python-all.ru/3.15/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.15/library/pathlib.html#pathlib.PurePath).183184Независимо от используемой системы можно создавать экземпляры всех этих классов, поскольку они не предоставляют никаких операций, совершающих системные вызовы.185186### Общие свойства187188Пути неизменяемы и [хэшируемые](https://python-all.ru/3.15/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.15/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.15/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.15/library/stdtypes.html#bytes) для пути возвращает сырой путь файловой системы в виде объекта bytes, закодированный с помощью [`os.fsencode()`](https://python-all.ru/3.15/library/os.html#os.fsencode):252253```python254>>> bytes(p)255b'/etc'256```257258> **Примечание**259>260> Вызов [`bytes`](https://python-all.ru/3.15/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.15/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.15/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.15/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.15/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.15/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Изменено в версии 3.14: Одиночная точка (”`.`”) считается допустимым суффиксом.447448#### `PurePath.suffixes`449450Список суффиксов пути, часто называемых расширениями файлов:451452```python453>>> PurePosixPath('my/library.tar.gar').suffixes454['.tar', '.gar']455>>> PurePosixPath('my/library.tar.gz').suffixes456['.tar', '.gz']457>>> PurePosixPath('my/library').suffixes458[]459```460461Изменено в версии 3.14: Одиночная точка (”`.`”) считается допустимым суффиксом.462463#### `PurePath.stem`464465Последний компонент пути без суффикса:466467```python468>>> PurePosixPath('my/library.tar.gz').stem469'library.tar'470>>> PurePosixPath('my/library.tar').stem471'library'472>>> PurePosixPath('my/library').stem473'library'474```475476Изменено в версии 3.14: Одиночная точка (”`.`”) считается допустимым суффиксом.477478#### `PurePath.as_posix()`479480Возвращает строковое представление пути с прямыми слэшами (`/`):481482```python483>>> p = PureWindowsPath('c:\\windows')484>>> str(p)485'c:\\windows'486>>> p.as_posix()487'c:/windows'488```489490#### `PurePath.is_absolute()`491492Возвращает, является ли путь абсолютным. Путь считается абсолютным, если у него есть и корень, и (если это допускает разновидность) диск:493494```python495>>> PurePosixPath('/a/b').is_absolute()496True497>>> PurePosixPath('a/b').is_absolute()498False499500>>> PureWindowsPath('c:/a/b').is_absolute()501True502>>> PureWindowsPath('/a/b').is_absolute()503False504>>> PureWindowsPath('c:').is_absolute()505False506>>> PureWindowsPath('//some/share').is_absolute()507True508```509510#### `PurePath.is_relative_to(other)`511512Возвращает, является ли этот путь относительным по отношению к пути *other*.513514```python515>>> p = PurePath('/etc/passwd')516>>> p.is_relative_to('/etc')517True518>>> p.is_relative_to('/usr')519False520```521522Этот метод основан на строках; он не обращается к файловой системе и не обрабатывает сегменты “`..`” особым образом. Следующий код эквивалентен:523524```python525>>> u = PurePath('/usr')526>>> u == p or u in p.parents527False528```529530Добавлено в версии 3.9.531532Устарело с версии 3.12, удалено в версии 3.14: Передача дополнительных аргументов устарела; если они переданы, они объединяются с *other*.533534#### `PurePath.joinpath(*pathsegments)`535536Вызов этого метода эквивалентен последовательному объединению пути с каждым из указанных *pathsegments*:537538```python539>>> PurePosixPath('/etc').joinpath('passwd')540PurePosixPath('/etc/passwd')541>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))542PurePosixPath('/etc/passwd')543>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')544PurePosixPath('/etc/init.d/apache2')545>>> PureWindowsPath('c:').joinpath('/Program Files')546PureWindowsPath('c:/Program Files')547```548549#### `PurePath.full_match(pattern, *, case_sensitive=None)`550551Сопоставляет этот путь с переданным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`. Например:552553```python554>>> PurePath('a/b.py').full_match('a/*.py')555True556>>> PurePath('a/b.py').full_match('*.py')557False558>>> PurePath('/a/b/c.py').full_match('/a/**')559True560>>> PurePath('/a/b/c.py').full_match('**/*.py')561True562```563564> **См. также**565>566> [Синтаксис шаблонов](https://python-all.ru/3.15/library/pathlib.html#pathlib-pattern-language) документации.567568Как и в других методах, чувствительность к регистру определяется по умолчанию платформой:569570```python571>>> PurePosixPath('b.py').full_match('*.PY')572False573>>> PureWindowsPath('b.py').full_match('*.PY')574True575```576577Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.578579Добавлено в версии 3.13.580581#### `PurePath.match(pattern, *, case_sensitive=None)`582583Сопоставляет этот путь с переданным нерекурсивным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`.584585Этот метод похож на [`full_match()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.full_match), но пустые шаблоны не допускаются (вызывается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError)), рекурсивный шаблон «`**`» не поддерживается (он работает как нерекурсивный «`*`»), и если задан относительный шаблон, сравнение выполняется справа:586587```python588>>> PurePath('a/b.py').match('*.py')589True590>>> PurePath('/a/b/c.py').match('b/*.py')591True592>>> PurePath('/a/b/c.py').match('a/*.py')593False594```595596Изменено в версии 3.12: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).597598Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.599600#### `PurePath.relative_to(other, walk_up=False)`601602Вычисляет версию этого пути, относительную пути, представленному *other*. Если это невозможно, вызывается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError):603604```python605>>> p = PurePosixPath('/etc/passwd')606>>> p.relative_to('/')607PurePosixPath('etc/passwd')608>>> p.relative_to('/etc')609PurePosixPath('passwd')610>>> p.relative_to('/usr')611Traceback (most recent call last):612 File "<stdin>", line 1, in <module>613 File "pathlib.py", line 941, in relative_to614 raise ValueError(error_message.format(str(self), str(formatted)))615ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.616```617618Когда *walk\_up* равно false (по умолчанию), путь должен начинаться с *other*. Когда аргумент true, могут быть добавлены элементы `..` для формирования относительного пути. Во всех остальных случаях, например, когда пути ссылаются на разные диски, вызывается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError):619620```python621>>> p.relative_to('/usr', walk_up=True)622PurePosixPath('../etc/passwd')623>>> p.relative_to('foo', walk_up=True)624Traceback (most recent call last):625 File "<stdin>", line 1, in <module>626 File "pathlib.py", line 941, in relative_to627 raise ValueError(error_message.format(str(self), str(formatted)))628ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.629```630631> **Предупреждение**632>633> Эта функция является частью [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath) и работает со строками. Она не проверяет и не обращается к нижележащей файловой структуре. Это может повлиять на опцию *walk\_up*, так как предполагается, что в пути нет символических ссылок; при необходимости сначала вызовите [`resolve()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.resolve) для разрешения символьных ссылок.634635Изменено в версии 3.12: Добавлен параметр *walk\_up* (старое поведение эквивалентно `walk_up=False`).636637Устарело с версии 3.12, удалено в версии 3.14: Передача дополнительных позиционных аргументов устарела; если они переданы, они объединяются с *other*.638639#### `PurePath.with_name(name)`640641Возвращает новый путь с изменённым [`name`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.name). Если у исходного пути нет имени, вызывается ValueError:642643```python644>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')645>>> p.with_name('setup.py')646PureWindowsPath('c:/Downloads/setup.py')647>>> p = PureWindowsPath('c:/')648>>> p.with_name('setup.py')649Traceback (most recent call last):650 File "<stdin>", line 1, in <module>651 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name652 raise ValueError("%r has an empty name" % (self,))653ValueError: PureWindowsPath('c:/') has an empty name654```655656#### `PurePath.with_stem(stem)`657658Возвращает новый путь с изменённым [`stem`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.stem). Если у исходного пути нет имени, вызывается ValueError:659660```python661>>> p = PureWindowsPath('c:/Downloads/draft.txt')662>>> p.with_stem('final')663PureWindowsPath('c:/Downloads/final.txt')664>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')665>>> p.with_stem('lib')666PureWindowsPath('c:/Downloads/lib.gz')667>>> p = PureWindowsPath('c:/')668>>> p.with_stem('')669Traceback (most recent call last):670 File "<stdin>", line 1, in <module>671 File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem672 return self.with_name(stem + self.suffix)673 File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name674 raise ValueError("%r has an empty name" % (self,))675ValueError: PureWindowsPath('c:/') has an empty name676```677678Добавлено в версии 3.9.679680#### `PurePath.with_suffix(suffix)`681682Возвращает новый путь с изменённым [`suffix`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.suffix). Если у исходного пути нет суффикса, вместо него добавляется новый *suffix*. Если *suffix* – пустая строка, исходный суффикс удаляется:683684```python685>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')686>>> p.with_suffix('.bz2')687PureWindowsPath('c:/Downloads/pathlib.tar.bz2')688>>> p = PureWindowsPath('README')689>>> p.with_suffix('.txt')690PureWindowsPath('README.txt')691>>> p = PureWindowsPath('README.txt')692>>> p.with_suffix('')693PureWindowsPath('README')694```695696Изменено в версии 3.14: Одна точка («`.`») считается допустимым суффиксом. В предыдущих версиях при указании одной точки вызывается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).697698#### `PurePath.with_segments(*pathsegments)`699700Создаёт новый объект пути того же типа, объединяя указанные *pathsegments*. Этот метод вызывается при создании производного пути, например из [`parent`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.parent) и [`relative_to()`](https://python-all.ru/3.15/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.15/library/pathlib.html#pathlib.PurePath); этот класс представляет конкретные пути, соответствующие flavour данной файловой системы (при создании экземпляра создаётся либо [`PosixPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PosixPath), либо [`WindowsPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.WindowsPath)):727728```python729>>> Path('setup.py')730PosixPath('setup.py')731```732733Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath).734735#### `class pathlib.PosixPath(*pathsegments)`736737Подкласс [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path) и [`PurePosixPath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePosixPath); этот класс представляет конкретные пути для файловых систем, отличных от Windows:738739```python740>>> PosixPath('/etc/hosts')741PosixPath('/etc/hosts')742```743744Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath).745746Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation) в Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).747748#### `class pathlib.WindowsPath(*pathsegments)`749750Подкласс [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path) и [`PureWindowsPath`](https://python-all.ru/3.15/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.15/library/pathlib.html#pathlib.PurePath).758759Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation) на платформах, отличных от Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/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.15/library/exceptions.html#OSError), если системный вызов завершается ошибкой (например, потому что путь не существует).780781### Разбор и генерация URI782783Объекты конкретных путей можно создавать из URI вида «file» и представлять в виде URI, соответствующих [**RFC 8089**](https://python-all.ru/3.15/library/pathlib.html).784785> **Примечание**786>787> URI файлов не переносимы между машинами с разными [кодировками файловой системы](https://python-all.ru/3.15/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.15/library/exceptions.html#ValueError) возбуждается, если URI не начинается с `file:`, или извлечённый путь не является абсолютным.821822Добавлено в версии 3.13.823824Изменено в версии 3.14: Authority URL отбрасывается, если оно совпадает с локальным именем хоста. В противном случае, если authority не пусто и не равно `localhost`, то в Windows возвращается UNC-путь (как и раньше), а на других платформах возбуждается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).825826#### `Path.as_uri()`827828Представляет путь в виде URI «file». [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError) возбуждается, если путь не является абсолютным.829830```pycon831>>> p = PosixPath('/etc/passwd')832>>> p.as_uri()833'file:///etc/passwd'834>>> p = WindowsPath('c:/Windows')835>>> p.as_uri()836'file:///c:/Windows'837```838839Устарело с версии 3.14, будет удалено в версии 3.19: Вызов этого метода из [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath), а не из [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path) возможен, но не рекомендуется. Использование [`os.fsencode()`](https://python-all.ru/3.15/library/os.html#os.fsencode) в этом методе делает его строго нечистым.840841### Расширение и разрешение путей842843#### `classmethod Path.home()`844845Возвращает новый объект пути, представляющий домашний каталог пользователя (как возвращается [`os.path.expanduser()`](https://python-all.ru/3.15/library/os.path.html#os.path.expanduser) с конструкцией `~`). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError).846847```python848>>> Path.home()849PosixPath('/home/antoine')850```851852Добавлено в версии 3.5.853854#### `Path.expanduser()`855856Возвращает новый путь с развёрнутыми конструкциями `~` и `~user`, как возвращается [`os.path.expanduser()`](https://python-all.ru/3.15/library/os.path.html#os.path.expanduser). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError).857858```python859>>> p = PosixPath('~/films/Monty Python')860>>> p.expanduser()861PosixPath('/home/eric/films/Monty Python')862```863864Добавлено в версии 3.5.865866#### `classmethod Path.cwd()`867868Возвращает новый объект пути, представляющий текущий каталог (как возвращается [`os.getcwd()`](https://python-all.ru/3.15/library/os.html#os.getcwd)):869870```python871>>> Path.cwd()872PosixPath('/home/antoine/pathlib')873```874875#### `Path.absolute()`876877Делает путь абсолютным, без нормализации или разрешения симлинков. Возвращает новый объект path:878879```python880>>> p = Path('tests')881>>> p882PosixPath('tests')883>>> p.absolute()884PosixPath('/home/antoine/pathlib/tests')885```886887#### `Path.resolve(strict=False)`888889Делает путь абсолютным, разрешая все символические ссылки. Возвращается новый объект пути:890891```python892>>> p = Path()893>>> p894PosixPath('.')895>>> p.resolve()896PosixPath('/home/antoine/pathlib')897```898899“`..`” компоненты также удаляются (это единственный метод, который это делает):900901```python902>>> p = Path('docs/../setup.py')903>>> p.resolve()904PosixPath('/home/antoine/pathlib/setup.py')905```906907Если путь не существует или обнаружен зацикленный симлинк, а *strict* равен `True`, возбуждается [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError). Если *strict* равен `False`, путь разрешается насколько возможно, а остаток добавляется без проверки его существования.908909Изменено в версии 3.6: Добавлен параметр *strict* (поведение до версии 3.6 – строгое).910911Изменено в версии 3.13: Зацикленные симлинки обрабатываются как другие ошибки: в строгом режиме возбуждается [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), а в нестрогом – исключение не возбуждается. В предыдущих версиях [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError) возбуждалось независимо от значения *strict*.912913#### `Path.readlink()`914915Возвращает путь, на который указывает симлинк (как возвращается [`os.readlink()`](https://python-all.ru/3.15/library/os.html#os.readlink)):916917```python918>>> p = Path('mylink')919>>> p.symlink_to('setup.py')920>>> p.readlink()921PosixPath('setup.py')922```923924Добавлено в версии 3.9.925926Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.readlink()`](https://python-all.ru/3.15/library/os.html#os.readlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).927928### Запрос типа файла и статуса929930Изменено в версии 3.8: Методы [`exists()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.exists), [`is_dir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_file), [`is_mount()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_mount), [`is_symlink()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_symlink), [`is_block_device()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_block_device), [`is_char_device()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_char_device), [`is_fifo()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_fifo), [`is_socket()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_socket) теперь возвращают `False` вместо возбуждения исключения для путей, содержащих символы, непредставимые на уровне ОС.931932Изменено в версии 3.14: Методы, перечисленные выше, теперь возвращают `False` вместо возбуждения любого исключения [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) от операционной системы. В предыдущих версиях некоторые виды исключений `OSError` возбуждались, а другие подавлялись. Новое поведение согласовано с [`os.path.exists()`](https://python-all.ru/3.15/library/os.path.html#os.path.exists), [`os.path.isdir()`](https://python-all.ru/3.15/library/os.path.html#os.path.isdir) и т. д. Используйте [`stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat) для получения статуса файла без подавления исключений.933934#### `Path.stat(*, follow_symlinks=True)`935936Возвращает объект [`os.stat_result`](https://python-all.ru/3.15/library/os.html#os.stat_result), содержащий информацию об этом пути, как [`os.stat()`](https://python-all.ru/3.15/library/os.html#os.stat). Результат запрашивается при каждом вызове этого метода.937938Этот метод обычно следует по симлинкам; чтобы выполнить stat для самого симлинка, добавьте аргумент `follow_symlinks=False`, или используйте [`lstat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.lstat).939940```python941>>> p = Path('setup.py')942>>> p.stat().st_size943956944>>> p.stat().st_mtime9451327883547.852554946```947948Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.949950#### `Path.lstat()`951952Как [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), но если путь указывает на симлинк, возвращает информацию о симлинке, а не о его цели.953954#### `Path.exists(*, follow_symlinks=True)`955956Возвращает `True`, если путь указывает на существующий файл или каталог. `False` возвращается, если путь недействителен, недоступен или отсутствует. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.957958Этот метод обычно следует по симлинкам; чтобы проверить существование симлинка, добавьте аргумент `follow_symlinks=False`.959960```python961>>> Path('.').exists()962True963>>> Path('setup.py').exists()964True965>>> Path('/etc').exists()966True967>>> Path('nonexistentfile').exists()968False969```970971Изменено в версии 3.12: Добавлен параметр *follow\_symlinks*.972973#### `Path.is_file(*, follow_symlinks=True)`974975Возвращает `True`, если путь указывает на обычный файл. `False` возвращается, если путь недействителен, недоступен или отсутствует, или если он указывает на что-то, отличное от обычного файла. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.976977Этот метод обычно следует по симлинкам; чтобы исключить симлинки, добавьте аргумент `follow_symlinks=False`.978979Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.980981#### `Path.is_dir(*, follow_symlinks=True)`982983Возвращает `True`, если путь указывает на каталог. `False` возвращается, если путь недействителен, недоступен или отсутствует, или если он указывает на что-то, отличное от каталога. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.984985Этот метод обычно следует по симлинкам; чтобы исключить симлинки на каталоги, добавьте аргумент `follow_symlinks=False`.986987Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.988989#### `Path.is_symlink()`990991Возвращает `True`, если путь указывает на символическую ссылку, даже если эта ссылка недействительна. `False` возвращается, если путь недопустим, недоступен или отсутствует, или указывает на что-то, отличное от символической ссылки. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.992993#### `Path.is_junction()`994995Возвращает `True`, если путь указывает на junction, и `False` для любого другого типа файла. В настоящее время только Windows поддерживает junctions.996997Добавлено в версии 3.12.998999#### `Path.is_mount()`10001001Возвращает `True`, если путь является *точкой монтирования*: точка в файловой системе, куда смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог *path*, `path/..`, на другом устройстве, чем *path*, или указывают ли `path/..` и *path* на один и тот же i-node на одном и том же устройстве – это должно определять точки монтирования для всех вариантов Unix и POSIX. В Windows точкой монтирования считается корень диска (например, `c:\`), общая папка UNC (например, `\\server\share`) или смонтированная директория файловой системы.10021003Добавлено в версии 3.7.10041005Изменено в версии 3.12: Добавлена поддержка Windows.10061007#### `Path.is_socket()`10081009Возвращает `True`, если путь указывает на сокет Unix. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от сокета Unix. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10101011#### `Path.is_fifo()`10121013Возвращает `True`, если путь указывает на FIFO. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от FIFO. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10141015#### `Path.is_block_device()`10161017Возвращает `True`, если путь указывает на блочное устройство. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от блочного устройства. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10181019#### `Path.is_char_device()`10201021Возвращает `True`, если путь указывает на символьное устройство. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от символьного устройства. Используйте [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10221023#### `Path.samefile(other_path)`10241025Возвращает, указывает ли этот путь на тот же файл, что и *other\_path*, который может быть как объектом Path, так и строкой. Семантика аналогична [`os.path.samefile()`](https://python-all.ru/3.15/library/os.path.html#os.path.samefile) и [`os.path.samestat()`](https://python-all.ru/3.15/library/os.path.html#os.path.samestat).10261027Исключение [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) может быть возбуждено, если какой-либо из файлов недоступен по какой-либо причине.10281029```python1030>>> p = Path('spam')1031>>> q = Path('eggs')1032>>> p.samefile(q)1033False1034>>> p.samefile('spam')1035True1036```10371038Добавлено в версии 3.5.10391040#### `Path.info`10411042Объект [`PathInfo`](https://python-all.ru/3.15/library/pathlib.html#pathlib.types.PathInfo), поддерживающий запрос информации о типе файла. Объект предоставляет методы, которые кэшируют свои результаты, что может помочь уменьшить количество системных вызовов, необходимых при переключении по типу файла. Например:10431044```python1045>>> p = Path('src')1046>>> if p.info.is_symlink():1047... print('symlink')1048... elif p.info.is_dir():1049... print('directory')1050... elif p.info.exists():1051... print('something else')1052... else:1053... print('not found')1054...1055directory1056```10571058Если путь был получен из [`Path.iterdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.iterdir), то этот атрибут инициализируется некоторой информацией о типе файла, полученной при сканировании родительского каталога. Простое обращение к `Path.info` не выполняет никаких запросов к файловой системе.10591060Для получения актуальной информации лучше вызывать [`Path.is_dir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_file) и [`is_symlink()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_symlink), а не методы этого атрибута. Сбросить кэш невозможно; вместо этого можно создать новый объект пути с пустым кэшем информации с помощью `p = Path(p)`.10611062Добавлено в версии 3.14.10631064### Чтение и запись файлов10651066#### `Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)`10671068Открывает файл, на который указывает путь, как это делает встроенная функция [`open()`](https://python-all.ru/3.15/library/functions.html#open) :10691070```python1071>>> p = Path('setup.py')1072>>> with p.open() as f:1073... f.readline()1074...1075'#!/usr/bin/env python3\n'1076```10771078#### `Path.read_text(encoding=None, errors=None, newline=None)`10791080Возвращает декодированное содержимое файла, на который указывает путь, в виде строки:10811082```python1083>>> p = Path('my_text_file')1084>>> p.write_text('Text file contents')1085181086>>> p.read_text()1087'Text file contents'1088```10891090Файл открывается, а затем закрывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.15/library/functions.html#open).10911092Добавлено в версии 3.5.10931094Изменено в версии 3.13: Добавлен параметр *newline*.10951096#### `Path.read_bytes()`10971098Возвращает двоичное содержимое файла, на который указывает путь, в виде объекта bytes:10991100```python1101>>> p = Path('my_binary_file')1102>>> p.write_bytes(b'Binary file contents')1103201104>>> p.read_bytes()1105b'Binary file contents'1106```11071108Добавлено в версии 3.5.11091110#### `Path.write_text(data, encoding=None, errors=None, newline=None)`11111112Открывает файл в текстовом режиме, записывает в него *data* и закрывает файл:11131114```python1115>>> p = Path('my_text_file')1116>>> p.write_text('Text file contents')1117181118>>> p.read_text()1119'Text file contents'1120```11211122Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.15/library/functions.html#open).11231124Добавлено в версии 3.5.11251126Изменено в версии 3.10: Добавлен параметр *newline*.11271128#### `Path.write_bytes(data)`11291130Открывает файл в байтовом режиме, записывает в него *data* и закрывает файл:11311132```python1133>>> p = Path('my_binary_file')1134>>> p.write_bytes(b'Binary file contents')1135201136>>> p.read_bytes()1137b'Binary file contents'1138```11391140Существующий файл с таким же именем перезаписывается.11411142Добавлено в версии 3.5.11431144### Чтение каталогов11451146#### `Path.iterdir()`11471148Если путь указывает на каталог, возвращает объекты пути для его содержимого:11491150```python1151>>> p = Path('docs')1152>>> for child in p.iterdir(): child1153...1154PosixPath('docs/conf.py')1155PosixPath('docs/_templates')1156PosixPath('docs/make.bat')1157PosixPath('docs/index.rst')1158PosixPath('docs/_build')1159PosixPath('docs/_static')1160PosixPath('docs/Makefile')1161```11621163Дочерние элементы возвращаются в произвольном порядке, а специальные записи `'.'` и `'..'` не включаются. Если файл удаляется или добавляется в каталог после создания итератора, то не определено, будет ли включен объект пути для этого файла.11641165Если путь не является каталогом или недоступен по другой причине, вызывается [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).11661167#### `Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False)`11681169Выполняет поиск по заданному относительному *pattern* в каталоге, представленном этим путем, возвращая все совпадающие файлы (любого типа):11701171```python1172>>> sorted(Path('.').glob('*.py'))1173[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]1174>>> sorted(Path('.').glob('*/*.py'))1175[PosixPath('docs/conf.py')]1176>>> sorted(Path('.').glob('**/*.py'))1177[PosixPath('build/lib/pathlib.py'),1178 PosixPath('docs/conf.py'),1179 PosixPath('pathlib.py'),1180 PosixPath('setup.py'),1181 PosixPath('test_pathlib.py')]1182```11831184> **Примечание**1185>1186> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.11871188> **См. также**1189>1190> [Синтаксис шаблонов](https://python-all.ru/3.15/library/pathlib.html#pathlib-pattern-language) документации.11911192По умолчанию, или когда аргумент *case\_sensitive* (только по имени) установлен в `None`, этот метод сопоставляет пути с учетом правил регистра, специфичных для платформы: обычно с учетом регистра на POSIX и без учета регистра на Windows. Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.11931194По умолчанию, или когда аргумент *recurse\_symlinks* (только по имени) установлен в `False`, этот метод переходит по символическим ссылкам, за исключением случаев раскрытия подстановочных знаков «`**`». Установите *recurse\_symlinks* в `True`, чтобы всегда следовать по символьным ссылкам.11951196> **Примечание**1197>1198> Все исключения [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.15/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.11991200Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `pathlib.Path.glob` с аргументами `self`, `pattern`.12011202Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.12031204Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.12051206Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).12071208Изменено в версии 3.13: Любые исключения [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. В предыдущих версиях такие исключения подавлялись во многих, но не во всех случаях.12091210#### `Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False)`12111212Выполняет рекурсивный поиск по заданному относительному *pattern*. Это аналогично вызову [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) с добавлением «`**/`» перед *pattern*.12131214> **Примечание**1215>1216> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.12171218> **Примечание**1219>1220> Все исключения [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.15/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.12211222> **См. также**1223>1224> [Синтаксис шаблонов](https://python-all.ru/3.15/library/pathlib.html#pathlib-pattern-language) и документация [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob).12251226Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `pathlib.Path.rglob` с аргументами `self`, `pattern`.12271228Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.12291230Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.12311232Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.15/glossary.html#term-path-like-object).12331234#### `Path.walk(top_down=True, on_error=None, follow_symlinks=False)`12351236Генерирует имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх.12371238Для каждого каталога в дереве каталогов с корнем *self* (включая *self*, но исключая '.' и '..'), метод возвращает кортеж из 3 элементов: `(dirpath, dirnames, filenames)`.12391240*dirpath* – это [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path) к текущему обходимому каталогу, *dirnames* – список строк с именами подкаталогов в *dirpath* (исключая `'.'` и `'..'`), а *filenames* – список строк с именами файлов (не каталогов) в *dirpath*. Чтобы получить полный путь (начинающийся с *self*) к файлу или каталогу в *dirpath*, используйте `dirpath / name`. Отсортированы ли списки, зависит от файловой системы.12411242Если необязательный аргумент *top\_down* равен true (по умолчанию), тройка для каталога генерируется до троек для любых его подкаталогов (каталоги обходятся сверху вниз). Если *top\_down* равен false, тройка для каталога генерируется после троек для всех его подкаталогов (каталоги обходятся снизу вверх). Независимо от значения *top\_down*, список подкаталогов извлекается до того, как будут обойдены тройки для каталога и его подкаталогов.12431244Когда *top\_down* равен true, вызывающий код может изменить список *dirnames* на месте (например, с помощью [`del`](https://python-all.ru/3.15/reference/simple_stmts.html#del) или присваивания среза), и `Path.walk()` будет рекурсивно обходить только те подкаталоги, чьи имена остались в *dirnames*. Это можно использовать для обрезки поиска, наложения определённого порядка обхода или даже для информирования `Path.walk()` о каталогах, которые вызывающий код создаёт или переименовывает до того, как возобновит `Path.walk()` снова. Изменение *dirnames*, когда *top\_down* равен false, не влияет на поведение `Path.walk()`, поскольку каталоги в *dirnames* уже были сгенерированы к моменту, когда *dirnames* передаётся вызывающему коду.12451246По умолчанию ошибки [`os.scandir()`](https://python-all.ru/3.15/library/os.html#os.scandir) игнорируются. Если указан необязательный аргумент *on\_error*, это должен быть вызываемый объект; он будет вызван с одним аргументом – экземпляром [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError). Этот вызываемый объект может обработать ошибку, чтобы продолжить обход, или повторно возбудить её, чтобы остановить обход. Обратите внимание: имя файла доступно как атрибут `filename` объекта исключения.12471248По умолчанию `Path.walk()` не переходит по символическим ссылкам, а вместо этого добавляет их в список *filenames*. Установите *follow\_symlinks* в true, чтобы разрешать символические ссылки и помещать их в *dirnames* и *filenames* в соответствии с их целями, и, таким образом, обходить каталоги, на которые указывают символические ссылки (если это поддерживается).12491250> **Примечание**1251>1252> Имейте в виду, что установка *follow\_symlinks* в true может привести к бесконечной рекурсии, если ссылка указывает на родительский каталог самой себя. `Path.walk()` не отслеживает уже посещённые каталоги.12531254> **Примечание**1255>1256> `Path.walk()` предполагает, что обходимые им каталоги не изменяются во время выполнения. Например, если каталог из *dirnames* был заменён символической ссылкой, а *follow\_symlinks* равно false, `Path.walk()` всё равно попытается спуститься в него. Чтобы предотвратить такое поведение, удаляйте каталоги из *dirnames* по мере необходимости.12571258> **Примечание**1259>1260> В отличие от [`os.walk()`](https://python-all.ru/3.15/library/os.html#os.walk), `Path.walk()` перечисляет символические ссылки на каталоги в *filenames*, если *follow\_symlinks* равно false.12611262Этот пример показывает количество байтов, используемых всеми файлами в каждом каталоге, игнорируя каталоги `__pycache__`:12631264```python1265from pathlib import Path1266for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):1267 print(1268 root,1269 "consumes",1270 sum((root / file).stat().st_size for file in files),1271 "bytes in",1272 len(files),1273 "non-directory files"1274 )1275 if '__pycache__' in dirs:1276 dirs.remove('__pycache__')1277```12781279Следующий пример – простая реализация [`shutil.rmtree()`](https://python-all.ru/3.15/library/shutil.html#shutil.rmtree). Обход дерева снизу вверх необходим, поскольку [`rmdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rmdir) не позволяет удалить каталог, пока он не пуст:12801281```python1282# Удалить всё, доступное из каталога "top".1283# ВНИМАНИЕ: Это опасно! Например, если top == Path('/'),1284# это может удалить все файлы.1285for root, dirs, files in top.walk(top_down=False):1286 for name in files:1287 (root / name).unlink()1288 for name in dirs:1289 (root / name).rmdir()1290```12911292Добавлено в версии 3.12.12931294### Создание файлов и каталогов12951296#### `Path.touch(mode=0o666, exist_ok=True)`12971298Создаёт файл по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если файл уже существует, функция завершается успешно, когда *exist\_ok* равен true (время модификации обновляется до текущего), в противном случае возбуждается [`FileExistsError`](https://python-all.ru/3.15/library/exceptions.html#FileExistsError).12991300> **См. также**1301>1302> Методы [`open()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.open), [`write_text()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.write_text) и [`write_bytes()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.write_bytes) часто используются для создания файлов.13031304#### `Path.mkdir(mode=0o777, parents=False, exist_ok=False, *, parent_mode=None)`13051306Создаёт новый каталог по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если путь уже существует, возбуждается [`FileExistsError`](https://python-all.ru/3.15/library/exceptions.html#FileExistsError).13071308Если *parents* равен true, любые отсутствующие родительские каталоги этого пути создаются по мере необходимости; они создаются с правами по умолчанию без учёта *mode* (имитируя команду POSIX `mkdir -p`).13091310Если *parent\_mode* не равен `None`, он используется в качестве режима для любых вновь создаваемых промежуточных каталогов, когда *parents* истинно. Как и *mode*, он комбинируется со значением `umask` процесса. В противном случае промежуточные каталоги создаются с правами по умолчанию (также с учётом umask).13111312Если *parents* равен false (по умолчанию), отсутствие родительского каталога вызывает [`FileNotFoundError`](https://python-all.ru/3.15/library/exceptions.html#FileNotFoundError).13131314Если *exist\_ok* равен false (по умолчанию), [`FileExistsError`](https://python-all.ru/3.15/library/exceptions.html#FileExistsError) возбуждается, если целевой каталог уже существует.13151316Если *exist\_ok* равен true, [`FileExistsError`](https://python-all.ru/3.15/library/exceptions.html#FileExistsError) не будет возбуждаться, за исключением случая, когда указанный путь уже существует в файловой системе и не является каталогом (аналогично поведению команды POSIX `mkdir -p`).13171318Изменено в версии 3.5: Добавлен параметр *exist\_ok*.13191320Добавлено в версии 3.15: Параметр *parent\_mode*.13211322#### `Path.symlink_to(target, target_is_directory=False)`13231324Делает этот путь символической ссылкой, указывающей на *target*.13251326В Windows символическая ссылка представляет собой файл или каталог и не изменяется динамически в соответствии с целью. Если цель существует, тип ссылки будет создан соответствующим. В противном случае ссылка будет создана как каталог, если *target\_is\_directory* равен true, или как файловая ссылка (по умолчанию) в противном случае. На платформах, отличных от Windows, *target\_is\_directory* игнорируется.13271328```python1329>>> p = Path('mylink')1330>>> p.symlink_to('setup.py')1331>>> p.resolve()1332PosixPath('/home/antoine/pathlib/setup.py')1333>>> p.stat().st_size13349561335>>> p.lstat().st_size133681337```13381339> **Примечание**1340>1341> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.symlink()`](https://python-all.ru/3.15/library/os.html#os.symlink).13421343Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.symlink()`](https://python-all.ru/3.15/library/os.html#os.symlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).13441345#### `Path.hardlink_to(target)`13461347Делает этот путь жёсткой ссылкой на тот же файл, что и *target*.13481349> **Примечание**1350>1351> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.link()`](https://python-all.ru/3.15/library/os.html#os.link).13521353Добавлено в версии 3.10.13541355Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.link()`](https://python-all.ru/3.15/library/os.html#os.link) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).13561357### Копирование, перемещение и удаление13581359#### `Path.copy(target, *, follow_symlinks=True, preserve_metadata=False)`13601361Копирует этот файл или дерево каталогов в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*.13621363Если источник является файлом, целевой объект будет заменён, если он уже существует. Если источник – символическая ссылка и *follow\_symlinks* равно true (по умолчанию), копируется объект, на который она указывает. В противном случае символическая ссылка воссоздаётся в месте назначения.13641365Если *preserve\_metadata* равно false (по умолчанию), гарантированно копируются только структура каталогов и данные файлов. Установите *preserve\_metadata* в true, чтобы при копировании также сохранялись права доступа к файлам и каталогам, флаги, время последнего доступа и изменения, а также расширенные атрибуты, где это поддерживается. Этот аргумент не влияет на копирование файлов в Windows (метаданные всегда сохраняются).13661367> **Примечание**1368>1369> Там, где это поддерживается операционной системой и файловой системой, этот метод выполняет облегчённое копирование, при котором блоки данных копируются только при их изменении. Это называется копированием при записи (copy-on-write).13701371Добавлено в версии 3.14.13721373#### `Path.copy_into(target_dir, *, follow_symlinks=True, preserve_metadata=False)`13741375Копирует этот файл или дерево каталогов в указанный *target\_dir*, который должен быть существующим каталогом. Остальные аргументы обрабатываются так же, как и в [`Path.copy()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.copy). Возвращает новый экземпляр `Path`, указывающий на копию.13761377Добавлено в версии 3.14.13781379#### `Path.rename(target)`13801381Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. В Unix, если *target* существует и является файлом, он будет молча заменён, если у пользователя есть разрешение. В Windows, если *target* существует, будет вызвано [`FileExistsError`](https://python-all.ru/3.15/library/exceptions.html#FileExistsError). *target* может быть строкой или другим объектом пути.13821383```python1384>>> p = Path('foo')1385>>> p.open('w').write('some text')138691387>>> target = Path('bar')1388>>> p.rename(target)1389PosixPath('bar')1390>>> target.open().read()1391'some text'1392```13931394Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.13951396Реализован через [`os.rename()`](https://python-all.ru/3.15/library/os.html#os.rename) и даёт те же гарантии.13971398Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.13991400#### `Path.replace(target)`14011402Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. Если *target* указывает на существующий файл или пустой каталог, он будет безусловно заменён.14031404Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.14051406Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.14071408#### `Path.move(target)`14091410Перемещает этот файл или дерево каталогов в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*.14111412Если *target* не существует, он будет создан. Если и этот путь, и *target* являются существующими файлами, то целевой файл будет перезаписан. Если оба пути указывают на один и тот же файл или каталог, или *target* является непустым каталогом, то вызывается [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).14131414Если оба пути находятся в одной файловой системе, перемещение выполняется с помощью [`os.replace()`](https://python-all.ru/3.15/library/os.html#os.replace). В противном случае этот путь копируется (с сохранением метаданных и символических ссылок), а затем удаляется.14151416Добавлено в версии 3.14.14171418#### `Path.move_into(target_dir)`14191420Перемещает этот файл или дерево каталогов в указанный *target\_dir*, который должен быть существующим каталогом. Возвращает новый экземпляр `Path`, указывающий на перемещённый путь.14211422Добавлено в версии 3.14.14231424#### `Path.unlink(missing_ok=False)`14251426Удаляет этот файл или символическую ссылку. Если путь указывает на каталог, используйте [`Path.rmdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rmdir).14271428Если *missing\_ok* равно false (по умолчанию), [`FileNotFoundError`](https://python-all.ru/3.15/library/exceptions.html#FileNotFoundError) вызывается, если путь не существует.14291430Если *missing\_ok* равно true, исключения [`FileNotFoundError`](https://python-all.ru/3.15/library/exceptions.html#FileNotFoundError) будут игнорироваться (аналогично поведению команды POSIX `rm -f`).14311432Изменено в версии 3.8: Добавлен параметр *missing\_ok*.14331434#### `Path.rmdir()`14351436Удаляет этот каталог. Каталог должен быть пустым.14371438### Права доступа и владение14391440#### `Path.owner(*, follow_symlinks=True)`14411442Возвращает имя пользователя, владеющего файлом. [`KeyError`](https://python-all.ru/3.15/library/exceptions.html#KeyError) вызывается, если идентификатор пользователя (UID) файла не найден в системной базе данных.14431444Этот метод обычно следует символическим ссылкам; чтобы получить владельца самой символической ссылки, добавьте аргумент `follow_symlinks=False`.14451446Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`pwd`](https://python-all.ru/3.15/library/pwd.html#module-pwd) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).14471448Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.14491450#### `Path.group(*, follow_symlinks=True)`14511452Возвращает имя группы, владеющей файлом. [`KeyError`](https://python-all.ru/3.15/library/exceptions.html#KeyError) возбуждается, если идентификатор группы (GID) файла не найден в системной базе данных.14531454Этот метод обычно переходит по символьным ссылкам. Для получения группы самой символьной ссылки используется аргумент `follow_symlinks=False`.14551456Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.15/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`grp`](https://python-all.ru/3.15/library/grp.html#module-grp) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.15/library/exceptions.html#NotImplementedError).14571458Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.14591460#### `Path.chmod(mode, *, follow_symlinks=True)`14611462Изменяет режим и права доступа к файлу, как [`os.chmod()`](https://python-all.ru/3.15/library/os.html#os.chmod).14631464Этот метод обычно переходит по символьным ссылкам. Некоторые варианты Unix поддерживают изменение прав доступа на самой символьной ссылке; на таких платформах можно добавить аргумент `follow_symlinks=False` или использовать [`lchmod()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.lchmod).14651466```python1467>>> p = Path('setup.py')1468>>> p.stat().st_mode1469332771470>>> p.chmod(0o444)1471>>> p.stat().st_mode1472330601473```14741475Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.14761477#### `Path.lchmod(mode)`14781479Как [`Path.chmod()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.chmod), но если путь указывает на символьную ссылку, то изменяется режим самой символьной ссылки, а не её цели.14801481## Язык шаблонов14821483В шаблонах для [`full_match()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.full_match), [`glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rglob) поддерживаются следующие подстановочные знаки:14841485**`**` (весь сегмент)**14861487Соответствует любому количеству сегментов файлов или каталогов, включая ноль.14881489**`*` (весь сегмент)**14901491Соответствует одному сегменту файла или каталога.14921493**`*` (часть сегмента)**14941495Соответствует любому количеству символов, не являющихся разделителями, включая ноль.14961497**`?`**14981499Соответствует одному символу, не являющемуся разделителем.15001501**`[seq]`**15021503Соответствует одному символу из *seq*, где *seq* – это последовательность символов. Поддерживаются диапазонные выражения; например, `[a-z]` соответствует любой строчной букве ASCII. Можно комбинировать несколько диапазонов: `[a-zA-Z0-9_]` соответствует любой букве ASCII, цифре или знаку подчеркивания.15041505**`[!seq]`**15061507Соответствует одному символу, не входящему в *seq*, где правила для *seq* такие же, как выше.15081509Для точного совпадения заключите метасимволы в скобки. Например, `"[?]"` соответствует символу `"?"`.15101511Подстановочный знак «`**`» включает рекурсивный поиск по шаблону. Несколько примеров:15121513| Шаблон | Значение |1514| --- | --- |1515| “`**/*`” | Любой путь, содержащий хотя бы один сегмент. |1516| “`**/*.py`” | Любой путь, последний сегмент которого заканчивается на «`.py`». |1517| “`assets/**`” | Любой путь, начинающийся с «`assets/`». |1518| “`assets/**/*`” | Любой путь, начинающийся с «`assets/`», за исключением самого «`assets/`». |15191520> **Примечание**1521>1522> Поиск по шаблону с использованием подстановочного знака «`**`» проходит по каждому каталогу в дереве. Большие деревья каталогов могут требовать много времени на поиск.15231524Изменено в версии 3.13: Поиск по шаблону, оканчивающемуся на «`**`», возвращает как файлы, так и каталоги. В предыдущих версиях возвращались только каталоги.15251526В [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rglob) к шаблону может быть добавлена конечная косая черта для соответствия только каталогам.15271528Изменено в версии 3.11: Поиск по шаблону, оканчивающемуся на разделитель компонентов пути ([`sep`](https://python-all.ru/3.15/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.15/library/os.html#os.altsep)), возвращает только каталоги.15291530## Сравнение с модулем [`glob`](https://python-all.ru/3.15/library/glob.html#module-glob)15311532Шаблоны, принимаемые [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rglob), и генерируемые ими результаты немного отличаются от результатов модуля [`glob`](https://python-all.ru/3.15/library/glob.html#module-glob):153315341. Файлы, начинающиеся с точки, не являются особыми в pathlib. Это аналогично передаче `include_hidden=True` в [`glob.glob()`](https://python-all.ru/3.15/library/glob.html#glob.glob).15352. Компоненты шаблона «`**`» в pathlib всегда рекурсивны. Это аналогично передаче `recursive=True` в [`glob.glob()`](https://python-all.ru/3.15/library/glob.html#glob.glob).15363. Компоненты шаблона «`**`» по умолчанию не переходят по символическим ссылкам в pathlib. Это поведение не имеет аналога в [`glob.glob()`](https://python-all.ru/3.15/library/glob.html#glob.glob), но можно передать `recurse_symlinks=True` в [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) для совместимого поведения.15374. Как и все объекты [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path), значения, возвращаемые из [`Path.glob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rglob), не содержат завершающих слешей.15385. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, включают *путь* в качестве префикса, в отличие от результатов `glob.glob(root_dir=path)`.15396. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, могут включать сам *путь*, например, при поиске по шаблону «`**`», тогда как результаты `glob.glob(root_dir=path)` никогда не включают пустую строку, которая соответствовала бы *пути*.15401541## Сравнение с модулями [`os`](https://python-all.ru/3.15/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path)15421543pathlib реализует операции с путями, используя объекты [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path), и поэтому считается *объектно-ориентированным*. С другой стороны, модули [`os`](https://python-all.ru/3.15/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path) предоставляют функции, работающие с низкоуровневыми объектами `str` и `bytes`, что является более *процедурным* подходом. Некоторые пользователи считают объектно-ориентированный стиль более читаемым.15441545Многие функции в [`os`](https://python-all.ru/3.15/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path) поддерживают пути `bytes` и [пути, относительные относительно дескрипторов каталогов](https://python-all.ru/3.15/library/os.html#dir-fd). Эти возможности недоступны в pathlib.15461547Типы `str` и `bytes`, а также части модулей [`os`](https://python-all.ru/3.15/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path), написаны на C и очень быстры. pathlib написан на чистом Python и обычно работает медленнее, но редко настолько, чтобы это было существенно.15481549Нормализация путей в pathlib немного более строгая и последовательная, чем в [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path). Например, тогда как [`os.path.abspath()`](https://python-all.ru/3.15/library/os.path.html#os.path.abspath) удаляет сегменты «`..`» из пути, что может изменить его значение при наличии символических ссылок, [`Path.absolute()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.absolute) сохраняет эти сегменты для большей безопасности.15501551Нормализация путей в pathlib может сделать её непригодной для некоторых приложений:155215531. pathlib нормализует `Path("my_folder/")` в `Path("my_folder")`, что меняет значение пути при передаче в различные API операционной системы и командной строки. В частности, отсутствие завершающего разделителя может позволить разрешить путь как файл или каталог, а не только как каталог.15542. pathlib нормализует `Path("./my_program")` в `Path("my_program")`, что меняет значение пути при использовании в качестве пути поиска исполняемых файлов, например в оболочке или при порождении дочернего процесса. В частности, отсутствие разделителя в пути может заставить искать его в `PATH` вместо текущего каталога.15551556Вследствие этих различий pathlib не является прямой заменой для [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path).15571558### Соответствующие инструменты15591560Ниже представлена таблица, сопоставляющая различные функции [`os`](https://python-all.ru/3.15/library/os.html#module-os) с их эквивалентами в [`PurePath`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath)/[`Path`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path).15611562| [`os`](https://python-all.ru/3.15/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.15/library/os.path.html#module-os.path) | `pathlib` |1563| --- | --- |1564| [`os.path.dirname()`](https://python-all.ru/3.15/library/os.path.html#os.path.dirname) | [`PurePath.parent`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.parent) |1565| [`os.path.basename()`](https://python-all.ru/3.15/library/os.path.html#os.path.basename) | [`PurePath.name`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.name) |1566| [`os.path.splitext()`](https://python-all.ru/3.15/library/os.path.html#os.path.splitext) | [`PurePath.stem`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.stem), [`PurePath.suffix`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.suffix) |1567| [`os.path.join()`](https://python-all.ru/3.15/library/os.path.html#os.path.join) | [`PurePath.joinpath()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.joinpath) |1568| [`os.path.isabs()`](https://python-all.ru/3.15/library/os.path.html#os.path.isabs) | [`PurePath.is_absolute()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.is_absolute) |1569| [`os.path.relpath()`](https://python-all.ru/3.15/library/os.path.html#os.path.relpath) | [`PurePath.relative_to()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.relative_to) [\[1\]](https://python-all.ru/3.15/library/pathlib.html#id7) |1570| [`os.path.expanduser()`](https://python-all.ru/3.15/library/os.path.html#os.path.expanduser) | [`Path.expanduser()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.expanduser) [\[2\]](https://python-all.ru/3.15/library/pathlib.html#id8) |1571| [`os.path.realpath()`](https://python-all.ru/3.15/library/os.path.html#os.path.realpath) | [`Path.resolve()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.resolve) |1572| [`os.path.abspath()`](https://python-all.ru/3.15/library/os.path.html#os.path.abspath) | [`Path.absolute()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.absolute) [\[3\]](https://python-all.ru/3.15/library/pathlib.html#id9) |1573| [`os.path.exists()`](https://python-all.ru/3.15/library/os.path.html#os.path.exists) | [`Path.exists()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.exists) |1574| [`os.path.isfile()`](https://python-all.ru/3.15/library/os.path.html#os.path.isfile) | [`Path.is_file()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_file) |1575| [`os.path.isdir()`](https://python-all.ru/3.15/library/os.path.html#os.path.isdir) | [`Path.is_dir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_dir) |1576| [`os.path.islink()`](https://python-all.ru/3.15/library/os.path.html#os.path.islink) | [`Path.is_symlink()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_symlink) |1577| [`os.path.isjunction()`](https://python-all.ru/3.15/library/os.path.html#os.path.isjunction) | [`Path.is_junction()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_junction) |1578| [`os.path.ismount()`](https://python-all.ru/3.15/library/os.path.html#os.path.ismount) | [`Path.is_mount()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.is_mount) |1579| [`os.path.samefile()`](https://python-all.ru/3.15/library/os.path.html#os.path.samefile) | [`Path.samefile()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.samefile) |1580| [`os.getcwd()`](https://python-all.ru/3.15/library/os.html#os.getcwd) | [`Path.cwd()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.cwd) |1581| [`os.stat()`](https://python-all.ru/3.15/library/os.html#os.stat) | [`Path.stat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.stat) |1582| [`os.lstat()`](https://python-all.ru/3.15/library/os.html#os.lstat) | [`Path.lstat()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.lstat) |1583| [`os.listdir()`](https://python-all.ru/3.15/library/os.html#os.listdir) | [`Path.iterdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.iterdir) |1584| [`os.walk()`](https://python-all.ru/3.15/library/os.html#os.walk) | [`Path.walk()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.walk) [\[4\]](https://python-all.ru/3.15/library/pathlib.html#id10) |1585| [`os.mkdir()`](https://python-all.ru/3.15/library/os.html#os.mkdir), [`os.makedirs()`](https://python-all.ru/3.15/library/os.html#os.makedirs) | [`Path.mkdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.mkdir) |1586| [`os.link()`](https://python-all.ru/3.15/library/os.html#os.link) | [`Path.hardlink_to()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.hardlink_to) |1587| [`os.symlink()`](https://python-all.ru/3.15/library/os.html#os.symlink) | [`Path.symlink_to()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.symlink_to) |1588| [`os.readlink()`](https://python-all.ru/3.15/library/os.html#os.readlink) | [`Path.readlink()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.readlink) |1589| [`os.rename()`](https://python-all.ru/3.15/library/os.html#os.rename) | [`Path.rename()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rename) |1590| [`os.replace()`](https://python-all.ru/3.15/library/os.html#os.replace) | [`Path.replace()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.replace) |1591| [`os.remove()`](https://python-all.ru/3.15/library/os.html#os.remove), [`os.unlink()`](https://python-all.ru/3.15/library/os.html#os.unlink) | [`Path.unlink()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.unlink) |1592| [`os.rmdir()`](https://python-all.ru/3.15/library/os.html#os.rmdir) | [`Path.rmdir()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.rmdir) |1593| [`os.chmod()`](https://python-all.ru/3.15/library/os.html#os.chmod) | [`Path.chmod()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.chmod) |1594| [`os.lchmod()`](https://python-all.ru/3.15/library/os.html#os.lchmod) | [`Path.lchmod()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.lchmod) |15951596Сноски15971598\[[1](https://python-all.ru/3.15/library/pathlib.html#id3)\]15991600[`os.path.relpath()`](https://python-all.ru/3.15/library/os.path.html#os.path.relpath) вызывает [`abspath()`](https://python-all.ru/3.15/library/os.path.html#os.path.abspath), чтобы сделать пути абсолютными и удалить части «`..`», тогда как [`PurePath.relative_to()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.PurePath.relative_to) является лексической операцией, которая возбуждает [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError), когда якоря входных путей различаются (например, если один путь абсолютный, а другой относительный).16011602\[[2](https://python-all.ru/3.15/library/pathlib.html#id4)\]16031604[`os.path.expanduser()`](https://python-all.ru/3.15/library/os.path.html#os.path.expanduser) возвращает путь без изменений, если домашний каталог не может быть определён, тогда как [`Path.expanduser()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.expanduser) возбуждает [`RuntimeError`](https://python-all.ru/3.15/library/exceptions.html#RuntimeError).16051606\[[3](https://python-all.ru/3.15/library/pathlib.html#id5)\]16071608[`os.path.abspath()`](https://python-all.ru/3.15/library/os.path.html#os.path.abspath) удаляет компоненты «`..`» без разрешения символических ссылок, что может изменить значение пути, тогда как [`Path.absolute()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.absolute) оставляет любые компоненты «`..`» в пути.16091610\[[4](https://python-all.ru/3.15/library/pathlib.html#id6)\]16111612[`os.walk()`](https://python-all.ru/3.15/library/os.html#os.walk) всегда следует символьным ссылкам при разбиении путей на *имена каталогов* и *имена файлов*, тогда как [`Path.walk()`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.walk) классифицирует все символьные ссылки как *имена файлов*, когда *follow\_symlinks* равен false (по умолчанию).16131614## Протоколы16151616Модуль `pathlib.types` предоставляет типы для статической проверки типов.16171618Добавлено в версии 3.14.16191620#### `class pathlib.types.PathInfo`16211622[`typing.Protocol`](https://python-all.ru/3.15/library/typing.html#typing.Protocol), описывающий атрибут [`Path.info`](https://python-all.ru/3.15/library/pathlib.html#pathlib.Path.info). Реализации могут возвращать кэшированные результаты из своих методов.16231624#### `exists(*, follow_symlinks=True)`16251626Возвращает `True`, если путь является существующим файлом, каталогом или любым другим типом файла; возвращает `False`, если путь не существует.16271628Если *follow\_symlinks* равен `False`, возвращает `True` для символьных ссылок без проверки существования их целей.16291630#### `is_dir(*, follow_symlinks=True)`16311632Возвращает `True`, если путь является каталогом или символьной ссылкой, указывающей на каталог; возвращает `False`, если путь является (или указывает на) любой другой тип файла, или если он не существует.16331634Если *follow\_symlinks* равен `False`, возвращает `True` только если путь является каталогом (без перехода по символьным ссылкам); возвращает `False`, если путь является любым другим типом файла, или если он не существует.16351636#### `is_file(*, follow_symlinks=True)`16371638Возвращает `True`, если путь является файлом или символической ссылкой на файл; возвращает `False`, если путь является (или указывает на) каталог или другой не-файл, или если он не существует.16391640Если *follow\_symlinks* равно `False`, возвращает `True` только если путь является файлом (без перехода по символическим ссылкам); возвращает `False`, если путь является каталогом или другим не-файлом, или если он не существует.16411642#### `is_symlink()`16431644Возвращает `True`, если путь является символической ссылкой (даже битой); возвращает `False`, если путь является каталогом или любым типом файла, или если он не существует.1645