Документация Python неофициальный перевод

pathlib.md

1649 строк · 110.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.14/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.14/Lib/pathlib)1213---1415Этот модуль предоставляет классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на [чистые пути](https://python-all.ru/3.14/library/pathlib.html#pure-paths), которые выполняют только вычислительные операции без ввода-вывода, и [конкретные пути](https://python-all.ru/3.14/library/pathlib.html#concrete-paths), которые наследуют чистые пути, но также предоставляют операции ввода-вывода.1617![Диаграмма наследования, показывающая классы, доступные в pathlib. Самый базовый класс – PurePath, у которого есть три непосредственных подкласса: PurePosixPath, PureWindowsPath и Path. Кроме этих четырёх классов, есть два класса, использующих множественное наследование: PosixPath наследует от PurePosixPath и Path, а WindowsPath наследует от PureWindowsPath и Path.](https://python-all.ru/3.14/_images/pathlib-inheritance.png)1819Если вы никогда не пользовались этим модулем раньше или просто не уверены, какой класс подходит для вашей задачи, скорее всего, вам нужен [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path). Он создаёт экземпляр [конкретного пути](https://python-all.ru/3.14/library/pathlib.html#concrete-paths) для платформы, на которой выполняется код.2021Чистые пути полезны в некоторых особых случаях; например:22231. Если требуется манипулировать путями Windows на машине Unix (или наоборот). При работе на Unix нельзя создать экземпляр [`WindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.WindowsPath), но можно создать [`PureWindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PureWindowsPath).242. Если нужно, чтобы код только манипулировал путями без фактического обращения к ОС. В таком случае может быть полезно создать экземпляр одного из чистых классов, поскольку они просто не имеют операций доступа к ОС.2526> **См. также**27>28> [**PEP 428**](https://python-all.ru/3.14/library/pathlib.html): модуль pathlib – объектно-ориентированные пути файловой системы.2930> **См. также**31>32> Для низкоуровневых манипуляций с путями в виде строк можно также использовать модуль [`os.path`](https://python-all.ru/3.14/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.14/library/exceptions.html#NotImplementedError), которое возбуждается при вызове неподдерживаемой операции над объектом пути.9394Добавлено в версии 3.13.9596## Чистые пути9798Объекты чистых путей предоставляют операции обработки путей, которые не обращаются к файловой системе. Существует три способа доступа к этим классам, которые также называются *разновидностями*:99100#### `class pathlib.PurePath(*pathsegments)`101102Общий класс, представляющий разновидность пути системы (при создании экземпляра создаётся либо [`PurePosixPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePosixPath), либо [`PureWindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PureWindowsPath)):103104```python105>>> PurePath('setup.py')      # Запуск на Unix-машине106PurePosixPath('setup.py')107```108109Каждый элемент *pathsegments* может быть либо строкой, представляющей сегмент пути, либо объектом, реализующим интерфейс [`os.PathLike`](https://python-all.ru/3.14/library/os.html#os.PathLike), где метод [`__fspath__()`](https://python-all.ru/3.14/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.14/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.14/library/os.html#os.PathLike), что позволяет использовать их везде, где этот интерфейс принимается.157158Изменено в версии 3.6: Добавлена поддержка интерфейса [`os.PathLike`](https://python-all.ru/3.14/library/os.html#os.PathLike).159160#### `class pathlib.PurePosixPath(*pathsegments)`161162Подкласс [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы, отличные от Windows:163164```python165>>> PurePosixPath('/etc/hosts')166PurePosixPath('/etc/hosts')167```168169Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath).170171#### `class pathlib.PureWindowsPath(*pathsegments)`172173Подкласс [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы Windows, включая [UNC-пути](https://python-all.ru/3.14/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.14/library/pathlib.html#pathlib.PurePath).183184Независимо от используемой системы можно создавать экземпляры всех этих классов, поскольку они не предоставляют никаких операций, совершающих системные вызовы.185186### Общие свойства187188Пути неизменяемы и [хэшируемые](https://python-all.ru/3.14/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.14/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.14/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.14/library/stdtypes.html#bytes) для пути возвращает сырой путь файловой системы в виде объекта bytes, закодированный с помощью [`os.fsencode()`](https://python-all.ru/3.14/library/os.html#os.fsencode):252253```python254>>> bytes(p)255b'/etc'256```257258> **Примечание**259>260> Вызов [`bytes`](https://python-all.ru/3.14/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.14/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.14/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.14/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.14/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.14/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.is_reserved()`535536С [`PureWindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PureWindowsPath) возвращает `True`, если путь считается зарезервированным в Windows, иначе `False`. С [`PurePosixPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePosixPath) всегда возвращается `False`.537538Изменено в версии 3.13: Имена путей Windows, содержащие двоеточие или заканчивающиеся точкой или пробелом, считаются зарезервированными. UNC-пути могут быть зарезервированы.539540Устарело с версии 3.13, будет удалено в версии 3.15: Этот метод устарел; используйте [`os.path.isreserved()`](https://python-all.ru/3.14/library/os.path.html#os.path.isreserved) для обнаружения зарезервированных путей в Windows.541542#### `PurePath.joinpath(*pathsegments)`543544Вызов этого метода эквивалентен последовательному объединению пути с каждым из указанных *pathsegments*:545546```python547>>> PurePosixPath('/etc').joinpath('passwd')548PurePosixPath('/etc/passwd')549>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))550PurePosixPath('/etc/passwd')551>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')552PurePosixPath('/etc/init.d/apache2')553>>> PureWindowsPath('c:').joinpath('/Program Files')554PureWindowsPath('c:/Program Files')555```556557#### `PurePath.full_match(pattern, *, case_sensitive=None)`558559Сопоставляет этот путь с переданным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`. Например:560561```python562>>> PurePath('a/b.py').full_match('a/*.py')563True564>>> PurePath('a/b.py').full_match('*.py')565False566>>> PurePath('/a/b/c.py').full_match('/a/**')567True568>>> PurePath('/a/b/c.py').full_match('**/*.py')569True570```571572> **См. также**573>574> [Синтаксис шаблонов](https://python-all.ru/3.14/library/pathlib.html#pathlib-pattern-language) документации.575576Как и в других методах, чувствительность к регистру определяется по умолчанию платформой:577578```python579>>> PurePosixPath('b.py').full_match('*.PY')580False581>>> PureWindowsPath('b.py').full_match('*.PY')582True583```584585Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.586587Добавлено в версии 3.13.588589#### `PurePath.match(pattern, *, case_sensitive=None)`590591Сопоставляет этот путь с переданным нерекурсивным шаблоном в стиле glob. Возвращает `True` при успешном сопоставлении, иначе `False`.592593Этот метод похож на [`full_match()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.full_match), но пустые шаблоны не допускаются (вызывается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError)), рекурсивный шаблон «`**`» не поддерживается (он работает как нерекурсивный «`*`»), и если задан относительный шаблон, сравнение выполняется справа:594595```python596>>> PurePath('a/b.py').match('*.py')597True598>>> PurePath('/a/b/c.py').match('b/*.py')599True600>>> PurePath('/a/b/c.py').match('a/*.py')601False602```603604Изменено в версии 3.12: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.14/glossary.html#term-path-like-object).605606Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.607608#### `PurePath.relative_to(other, walk_up=False)`609610Вычисляет версию этого пути, относительную пути, представленному *other*. Если это невозможно, вызывается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError):611612```python613>>> p = PurePosixPath('/etc/passwd')614>>> p.relative_to('/')615PurePosixPath('etc/passwd')616>>> p.relative_to('/etc')617PurePosixPath('passwd')618>>> p.relative_to('/usr')619Traceback (most recent call last):620  File "<stdin>", line 1, in <module>621  File "pathlib.py", line 941, in relative_to622    raise ValueError(error_message.format(str(self), str(formatted)))623ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.624```625626Когда *walk\_up* равно false (по умолчанию), путь должен начинаться с *other*. Когда аргумент true, могут быть добавлены элементы `..` для формирования относительного пути. Во всех остальных случаях, например, когда пути ссылаются на разные диски, вызывается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError):627628```python629>>> p.relative_to('/usr', walk_up=True)630PurePosixPath('../etc/passwd')631>>> p.relative_to('foo', walk_up=True)632Traceback (most recent call last):633  File "<stdin>", line 1, in <module>634  File "pathlib.py", line 941, in relative_to635    raise ValueError(error_message.format(str(self), str(formatted)))636ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.637```638639> **Предупреждение**640>641> Эта функция является частью [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath) и работает со строками. Она не проверяет и не обращается к нижележащей файловой структуре. Это может повлиять на опцию *walk\_up*, так как предполагается, что в пути нет символических ссылок; при необходимости сначала вызовите [`resolve()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.resolve) для разрешения символьных ссылок.642643Изменено в версии 3.12: Добавлен параметр *walk\_up* (старое поведение эквивалентно `walk_up=False`).644645Устарело с версии 3.12, удалено в версии 3.14: Передача дополнительных позиционных аргументов устарела; если они переданы, они объединяются с *other*.646647#### `PurePath.with_name(name)`648649Возвращает новый путь с изменённым [`name`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.name). Если у исходного пути нет имени, вызывается ValueError:650651```python652>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')653>>> p.with_name('setup.py')654PureWindowsPath('c:/Downloads/setup.py')655>>> p = PureWindowsPath('c:/')656>>> p.with_name('setup.py')657Traceback (most recent call last):658  File "<stdin>", line 1, in <module>659  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name660    raise ValueError("%r has an empty name" % (self,))661ValueError: PureWindowsPath('c:/') has an empty name662```663664#### `PurePath.with_stem(stem)`665666Возвращает новый путь с изменённым [`stem`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.stem). Если у исходного пути нет имени, вызывается ValueError:667668```python669>>> p = PureWindowsPath('c:/Downloads/draft.txt')670>>> p.with_stem('final')671PureWindowsPath('c:/Downloads/final.txt')672>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')673>>> p.with_stem('lib')674PureWindowsPath('c:/Downloads/lib.gz')675>>> p = PureWindowsPath('c:/')676>>> p.with_stem('')677Traceback (most recent call last):678  File "<stdin>", line 1, in <module>679  File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem680    return self.with_name(stem + self.suffix)681  File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name682    raise ValueError("%r has an empty name" % (self,))683ValueError: PureWindowsPath('c:/') has an empty name684```685686Добавлено в версии 3.9.687688#### `PurePath.with_suffix(suffix)`689690Возвращает новый путь с изменённым [`suffix`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.suffix). Если у исходного пути нет суффикса, вместо него добавляется новый *suffix*. Если *suffix* – пустая строка, исходный суффикс удаляется:691692```python693>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')694>>> p.with_suffix('.bz2')695PureWindowsPath('c:/Downloads/pathlib.tar.bz2')696>>> p = PureWindowsPath('README')697>>> p.with_suffix('.txt')698PureWindowsPath('README.txt')699>>> p = PureWindowsPath('README.txt')700>>> p.with_suffix('')701PureWindowsPath('README')702```703704Изменено в версии 3.14: Одна точка («`.`») считается допустимым суффиксом. В предыдущих версиях при указании одной точки вызывается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError).705706#### `PurePath.with_segments(*pathsegments)`707708Создаёт новый объект пути того же типа, объединяя указанные *pathsegments*. Этот метод вызывается при создании производного пути, например из [`parent`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.parent) и [`relative_to()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.relative_to). Подклассы могут переопределять этот метод для передачи информации производным путям, например:709710```python711from pathlib import PurePosixPath712713class MyPath(PurePosixPath):714    def __init__(self, *pathsegments, session_id):715        super().__init__(*pathsegments)716        self.session_id = session_id717718    def with_segments(self, *pathsegments):719        return type(self)(*pathsegments, session_id=self.session_id)720721etc = MyPath('/etc', session_id=42)722hosts = etc / 'hosts'723print(hosts.session_id)  # 42724```725726Добавлено в версии 3.12.727728## Конкретные пути729730Конкретные пути – это подклассы чистых классов путей. В дополнение к операциям, предоставляемым последними, они также предоставляют методы для выполнения системных вызовов над объектами путей. Есть три способа создания конкретных путей:731732#### `class pathlib.Path(*pathsegments)`733734Подкласс [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath); этот класс представляет конкретные пути, соответствующие flavour данной файловой системы (при создании экземпляра создаётся либо [`PosixPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PosixPath), либо [`WindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.WindowsPath)):735736```python737>>> Path('setup.py')738PosixPath('setup.py')739```740741Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath).742743#### `class pathlib.PosixPath(*pathsegments)`744745Подкласс [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path) и [`PurePosixPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePosixPath); этот класс представляет конкретные пути для файловых систем, отличных от Windows:746747```python748>>> PosixPath('/etc/hosts')749PosixPath('/etc/hosts')750```751752Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath).753754Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation) в Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).755756#### `class pathlib.WindowsPath(*pathsegments)`757758Подкласс [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path) и [`PureWindowsPath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PureWindowsPath); этот класс представляет конкретные пути файловой системы Windows:759760```python761>>> WindowsPath('c:/', 'Users', 'Ximénez')762WindowsPath('c:/Users/Ximénez')763```764765Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath).766767Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation) на платформах, отличных от Windows. В предыдущих версиях вместо него возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).768769Можно создать экземпляр только того flavour класса, который соответствует системе (использование системных вызовов для несовместимых flavour путей может привести к ошибкам или сбоям в приложении):770771```python772>>> import os773>>> os.name774'posix'775>>> Path('setup.py')776PosixPath('setup.py')777>>> PosixPath('setup.py')778PosixPath('setup.py')779>>> WindowsPath('setup.py')780Traceback (most recent call last):781  File "<stdin>", line 1, in <module>782  File "pathlib.py", line 798, in __new__783    % (cls.__name__,))784UnsupportedOperation: cannot instantiate 'WindowsPath' on your system785```786787Некоторые методы конкретных путей могут возбуждать [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), если системный вызов завершается ошибкой (например, потому что путь не существует).788789### Разбор и генерация URI790791Объекты конкретных путей можно создавать из URI вида «file» и представлять в виде URI, соответствующих [**RFC 8089**](https://python-all.ru/3.14/library/pathlib.html).792793> **Примечание**794>795> URI файлов не переносимы между машинами с разными [кодировками файловой системы](https://python-all.ru/3.14/library/os.html#filesystem-encoding).796797#### `classmethod Path.from_uri(uri)`798799Возвращает новый объект пути из разбора URI вида «file». Например:800801```python802>>> p = Path.from_uri('file:///etc/hosts')803PosixPath('/etc/hosts')804```805806В Windows пути устройств DOS и UNC могут быть получены разбором URI:807808```python809>>> p = Path.from_uri('file:///c:/windows')810WindowsPath('c:/windows')811>>> p = Path.from_uri('file://server/share')812WindowsPath('//server/share')813```814815Поддерживается несколько вариантов:816817```python818>>> p = Path.from_uri('file:////server/share')819WindowsPath('//server/share')820>>> p = Path.from_uri('file://///server/share')821WindowsPath('//server/share')822>>> p = Path.from_uri('file:c:/windows')823WindowsPath('c:/windows')824>>> p = Path.from_uri('file:/c|/windows')825WindowsPath('c:/windows')826```827828[`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError) возбуждается, если URI не начинается с `file:`, или извлечённый путь не является абсолютным.829830Добавлено в версии 3.13.831832Изменено в версии 3.14: Authority URL отбрасывается, если оно совпадает с локальным именем хоста. В противном случае, если authority не пусто и не равно `localhost`, то в Windows возвращается UNC-путь (как и раньше), а на других платформах возбуждается [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError).833834#### `Path.as_uri()`835836Представляет путь в виде URI «file». [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError) возбуждается, если путь не является абсолютным.837838```pycon839>>> p = PosixPath('/etc/passwd')840>>> p.as_uri()841'file:///etc/passwd'842>>> p = WindowsPath('c:/Windows')843>>> p.as_uri()844'file:///c:/Windows'845```846847Устарело с версии 3.14, будет удалено в версии 3.19: Вызов этого метода из [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath), а не из [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path) возможен, но не рекомендуется. Использование [`os.fsencode()`](https://python-all.ru/3.14/library/os.html#os.fsencode) в этом методе делает его строго нечистым.848849### Расширение и разрешение путей850851#### `classmethod Path.home()`852853Возвращает новый объект пути, представляющий домашний каталог пользователя (как возвращается [`os.path.expanduser()`](https://python-all.ru/3.14/library/os.path.html#os.path.expanduser) с конструкцией `~`). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.14/library/exceptions.html#RuntimeError).854855```python856>>> Path.home()857PosixPath('/home/antoine')858```859860Добавлено в версии 3.5.861862#### `Path.expanduser()`863864Возвращает новый путь с развёрнутыми конструкциями `~` и `~user`, как возвращается [`os.path.expanduser()`](https://python-all.ru/3.14/library/os.path.html#os.path.expanduser). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.14/library/exceptions.html#RuntimeError).865866```python867>>> p = PosixPath('~/films/Monty Python')868>>> p.expanduser()869PosixPath('/home/eric/films/Monty Python')870```871872Добавлено в версии 3.5.873874#### `classmethod Path.cwd()`875876Возвращает новый объект пути, представляющий текущий каталог (как возвращается [`os.getcwd()`](https://python-all.ru/3.14/library/os.html#os.getcwd)):877878```python879>>> Path.cwd()880PosixPath('/home/antoine/pathlib')881```882883#### `Path.absolute()`884885Делает путь абсолютным, без нормализации или разрешения симлинков. Возвращает новый объект path:886887```python888>>> p = Path('tests')889>>> p890PosixPath('tests')891>>> p.absolute()892PosixPath('/home/antoine/pathlib/tests')893```894895#### `Path.resolve(strict=False)`896897Делает путь абсолютным, разрешая все символические ссылки. Возвращается новый объект пути:898899```python900>>> p = Path()901>>> p902PosixPath('.')903>>> p.resolve()904PosixPath('/home/antoine/pathlib')905```906907`..`” компоненты также удаляются (это единственный метод, который это делает):908909```python910>>> p = Path('docs/../setup.py')911>>> p.resolve()912PosixPath('/home/antoine/pathlib/setup.py')913```914915Если путь не существует или обнаружен зацикленный симлинк, а *strict* равен `True`, возбуждается [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError). Если *strict* равен `False`, путь разрешается насколько возможно, а остаток добавляется без проверки его существования.916917Изменено в версии 3.6: Добавлен параметр *strict* (поведение до версии 3.6 – строгое).918919Изменено в версии 3.13: Зацикленные симлинки обрабатываются как другие ошибки: в строгом режиме возбуждается [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), а в нестрогом – исключение не возбуждается. В предыдущих версиях [`RuntimeError`](https://python-all.ru/3.14/library/exceptions.html#RuntimeError) возбуждалось независимо от значения *strict*.920921#### `Path.readlink()`922923Возвращает путь, на который указывает симлинк (как возвращается [`os.readlink()`](https://python-all.ru/3.14/library/os.html#os.readlink)):924925```python926>>> p = Path('mylink')927>>> p.symlink_to('setup.py')928>>> p.readlink()929PosixPath('setup.py')930```931932Добавлено в версии 3.9.933934Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.readlink()`](https://python-all.ru/3.14/library/os.html#os.readlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).935936### Запрос типа файла и статуса937938Изменено в версии 3.8: Методы [`exists()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.exists), [`is_dir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_file), [`is_mount()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_mount), [`is_symlink()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_symlink), [`is_block_device()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_block_device), [`is_char_device()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_char_device), [`is_fifo()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_fifo), [`is_socket()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_socket) теперь возвращают `False` вместо возбуждения исключения для путей, содержащих символы, непредставимые на уровне ОС.939940Изменено в версии 3.14: Методы, перечисленные выше, теперь возвращают `False` вместо возбуждения любого исключения [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError) от операционной системы. В предыдущих версиях некоторые виды исключений `OSError` возбуждались, а другие подавлялись. Новое поведение согласовано с [`os.path.exists()`](https://python-all.ru/3.14/library/os.path.html#os.path.exists), [`os.path.isdir()`](https://python-all.ru/3.14/library/os.path.html#os.path.isdir) и т. д. Используйте [`stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat) для получения статуса файла без подавления исключений.941942#### `Path.stat(*, follow_symlinks=True)`943944Возвращает объект [`os.stat_result`](https://python-all.ru/3.14/library/os.html#os.stat_result), содержащий информацию об этом пути, как [`os.stat()`](https://python-all.ru/3.14/library/os.html#os.stat). Результат запрашивается при каждом вызове этого метода.945946Этот метод обычно следует по симлинкам; чтобы выполнить stat для самого симлинка, добавьте аргумент `follow_symlinks=False`, или используйте [`lstat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.lstat).947948```python949>>> p = Path('setup.py')950>>> p.stat().st_size951956952>>> p.stat().st_mtime9531327883547.852554954```955956Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.957958#### `Path.lstat()`959960Как [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), но если путь указывает на симлинк, возвращает информацию о симлинке, а не о его цели.961962#### `Path.exists(*, follow_symlinks=True)`963964Возвращает `True`, если путь указывает на существующий файл или каталог. `False` возвращается, если путь недействителен, недоступен или отсутствует. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.965966Этот метод обычно следует по симлинкам; чтобы проверить существование симлинка, добавьте аргумент `follow_symlinks=False`.967968```python969>>> Path('.').exists()970True971>>> Path('setup.py').exists()972True973>>> Path('/etc').exists()974True975>>> Path('nonexistentfile').exists()976False977```978979Изменено в версии 3.12: Добавлен параметр *follow\_symlinks*.980981#### `Path.is_file(*, follow_symlinks=True)`982983Возвращает `True`, если путь указывает на обычный файл. `False` возвращается, если путь недействителен, недоступен или отсутствует, или если он указывает на что-то, отличное от обычного файла. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.984985Этот метод обычно следует по симлинкам; чтобы исключить симлинки, добавьте аргумент `follow_symlinks=False`.986987Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.988989#### `Path.is_dir(*, follow_symlinks=True)`990991Возвращает `True`, если путь указывает на каталог. `False` возвращается, если путь недействителен, недоступен или отсутствует, или если он указывает на что-то, отличное от каталога. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat) для различения этих случаев.992993Этот метод обычно следует по симлинкам; чтобы исключить симлинки на каталоги, добавьте аргумент `follow_symlinks=False`.994995Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.996997#### `Path.is_symlink()`998999Возвращает `True`, если путь указывает на символическую ссылку, даже если эта ссылка недействительна. `False` возвращается, если путь недопустим, недоступен или отсутствует, или указывает на что-то, отличное от символической ссылки. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10001001#### `Path.is_junction()`10021003Возвращает `True`, если путь указывает на junction, и `False` для любого другого типа файла. В настоящее время только Windows поддерживает junctions.10041005Добавлено в версии 3.12.10061007#### `Path.is_mount()`10081009Возвращает `True`, если путь является *точкой монтирования*: точка в файловой системе, куда смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог *path*, `path/..`, на другом устройстве, чем *path*, или указывают ли `path/..` и *path* на один и тот же i-node на одном и том же устройстве – это должно определять точки монтирования для всех вариантов Unix и POSIX. В Windows точкой монтирования считается корень диска (например, `c:\`), общая папка UNC (например, `\\server\share`) или смонтированная директория файловой системы.10101011Добавлено в версии 3.7.10121013Изменено в версии 3.12: Добавлена поддержка Windows.10141015#### `Path.is_socket()`10161017Возвращает `True`, если путь указывает на сокет Unix. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от сокета Unix. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10181019#### `Path.is_fifo()`10201021Возвращает `True`, если путь указывает на FIFO. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от FIFO. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10221023#### `Path.is_block_device()`10241025Возвращает `True`, если путь указывает на блочное устройство. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от блочного устройства. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10261027#### `Path.is_char_device()`10281029Возвращает `True`, если путь указывает на символьное устройство. `False` будет возвращен, если путь недопустим, недоступен или отсутствует, или указывает на что-то отличное от символьного устройства. Используйте [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat), чтобы различать эти случаи.10301031#### `Path.samefile(other_path)`10321033Возвращает, указывает ли этот путь на тот же файл, что и *other\_path*, который может быть как объектом Path, так и строкой. Семантика аналогична [`os.path.samefile()`](https://python-all.ru/3.14/library/os.path.html#os.path.samefile) и [`os.path.samestat()`](https://python-all.ru/3.14/library/os.path.html#os.path.samestat).10341035Исключение [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError) может быть возбуждено, если какой-либо из файлов недоступен по какой-либо причине.10361037```python1038>>> p = Path('spam')1039>>> q = Path('eggs')1040>>> p.samefile(q)1041False1042>>> p.samefile('spam')1043True1044```10451046Добавлено в версии 3.5.10471048#### `Path.info`10491050Объект [`PathInfo`](https://python-all.ru/3.14/library/pathlib.html#pathlib.types.PathInfo), поддерживающий запрос информации о типе файла. Объект предоставляет методы, которые кэшируют свои результаты, что может помочь уменьшить количество системных вызовов, необходимых при переключении по типу файла. Например:10511052```python1053>>> p = Path('src')1054>>> if p.info.is_symlink():1055...     print('symlink')1056... elif p.info.is_dir():1057...     print('directory')1058... elif p.info.exists():1059...     print('something else')1060... else:1061...     print('not found')1062...1063directory1064```10651066Если путь был получен из [`Path.iterdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.iterdir), то этот атрибут инициализируется некоторой информацией о типе файла, полученной при сканировании родительского каталога. Простое обращение к `Path.info` не выполняет никаких запросов к файловой системе.10671068Для получения актуальной информации лучше вызывать [`Path.is_dir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_file) и [`is_symlink()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_symlink), а не методы этого атрибута. Сбросить кэш невозможно; вместо этого можно создать новый объект пути с пустым кэшем информации с помощью `p = Path(p)`.10691070Добавлено в версии 3.14.10711072### Чтение и запись файлов10731074#### `Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)`10751076Открывает файл, на который указывает путь, как это делает встроенная функция [`open()`](https://python-all.ru/3.14/library/functions.html#open) :10771078```python1079>>> p = Path('setup.py')1080>>> with p.open() as f:1081...     f.readline()1082...1083'#!/usr/bin/env python3\n'1084```10851086#### `Path.read_text(encoding=None, errors=None, newline=None)`10871088Возвращает декодированное содержимое файла, на который указывает путь, в виде строки:10891090```python1091>>> p = Path('my_text_file')1092>>> p.write_text('Text file contents')1093181094>>> p.read_text()1095'Text file contents'1096```10971098Файл открывается, а затем закрывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.14/library/functions.html#open).10991100Добавлено в версии 3.5.11011102Изменено в версии 3.13: Добавлен параметр *newline*.11031104#### `Path.read_bytes()`11051106Возвращает двоичное содержимое файла, на который указывает путь, в виде объекта bytes:11071108```python1109>>> p = Path('my_binary_file')1110>>> p.write_bytes(b'Binary file contents')1111201112>>> p.read_bytes()1113b'Binary file contents'1114```11151116Добавлено в версии 3.5.11171118#### `Path.write_text(data, encoding=None, errors=None, newline=None)`11191120Открывает файл в текстовом режиме, записывает в него *data* и закрывает файл:11211122```python1123>>> p = Path('my_text_file')1124>>> p.write_text('Text file contents')1125181126>>> p.read_text()1127'Text file contents'1128```11291130Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.14/library/functions.html#open).11311132Добавлено в версии 3.5.11331134Изменено в версии 3.10: Добавлен параметр *newline*.11351136#### `Path.write_bytes(data)`11371138Открывает файл в байтовом режиме, записывает в него *data* и закрывает файл:11391140```python1141>>> p = Path('my_binary_file')1142>>> p.write_bytes(b'Binary file contents')1143201144>>> p.read_bytes()1145b'Binary file contents'1146```11471148Существующий файл с таким же именем перезаписывается.11491150Добавлено в версии 3.5.11511152### Чтение каталогов11531154#### `Path.iterdir()`11551156Если путь указывает на каталог, возвращает объекты пути для его содержимого:11571158```python1159>>> p = Path('docs')1160>>> for child in p.iterdir(): child1161...1162PosixPath('docs/conf.py')1163PosixPath('docs/_templates')1164PosixPath('docs/make.bat')1165PosixPath('docs/index.rst')1166PosixPath('docs/_build')1167PosixPath('docs/_static')1168PosixPath('docs/Makefile')1169```11701171Дочерние элементы возвращаются в произвольном порядке, а специальные записи `'.'` и `'..'` не включаются. Если файл удаляется или добавляется в каталог после создания итератора, то не определено, будет ли включен объект пути для этого файла.11721173Если путь не является каталогом или недоступен по другой причине, вызывается [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError).11741175#### `Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False)`11761177Выполняет поиск по заданному относительному *pattern* в каталоге, представленном этим путем, возвращая все совпадающие файлы (любого типа):11781179```python1180>>> sorted(Path('.').glob('*.py'))1181[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]1182>>> sorted(Path('.').glob('*/*.py'))1183[PosixPath('docs/conf.py')]1184>>> sorted(Path('.').glob('**/*.py'))1185[PosixPath('build/lib/pathlib.py'),1186 PosixPath('docs/conf.py'),1187 PosixPath('pathlib.py'),1188 PosixPath('setup.py'),1189 PosixPath('test_pathlib.py')]1190```11911192> **Примечание**1193>1194> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.11951196> **См. также**1197>1198> [Синтаксис шаблонов](https://python-all.ru/3.14/library/pathlib.html#pathlib-pattern-language) документации.11991200По умолчанию, или когда аргумент *case\_sensitive* (только по имени) установлен в `None`, этот метод сопоставляет пути с учетом правил регистра, специфичных для платформы: обычно с учетом регистра на POSIX и без учета регистра на Windows. Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.12011202По умолчанию, или когда аргумент *recurse\_symlinks* (только по имени) установлен в `False`, этот метод переходит по символическим ссылкам, за исключением случаев раскрытия подстановочных знаков «`**`». Установите *recurse\_symlinks* в `True`, чтобы всегда следовать по символьным ссылкам.12031204> **Примечание**1205>1206> Все исключения [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.14/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.12071208Возбуждает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `pathlib.Path.glob` с аргументами `self`, `pattern`.12091210Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.12111212Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.12131214Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.14/glossary.html#term-path-like-object).12151216Изменено в версии 3.13: Любые исключения [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. В предыдущих версиях такие исключения подавлялись во многих, но не во всех случаях.12171218#### `Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False)`12191220Выполняет рекурсивный поиск по заданному относительному *pattern*. Это аналогично вызову [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) с добавлением «`**/`» перед *pattern*.12211222> **Примечание**1223>1224> Пути возвращаются в произвольном порядке. Если требуется определенный порядок, отсортируйте результаты.12251226> **Примечание**1227>1228> Все исключения [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), возникающие при сканировании файловой системы, подавляются. Включая [`PermissionError`](https://python-all.ru/3.14/library/exceptions.html#PermissionError) при доступе к каталогам без права на чтение.12291230> **См. также**1231>1232> [Синтаксис шаблонов](https://python-all.ru/3.14/library/pathlib.html#pathlib-pattern-language) и документация [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob).12331234Возбуждает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `pathlib.Path.rglob` с аргументами `self`, `pattern`.12351236Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.12371238Изменено в версии 3.13: Добавлен параметр *recurse\_symlinks*.12391240Изменено в версии 3.13: Параметр *pattern* теперь принимает [объект, подобный пути](https://python-all.ru/3.14/glossary.html#term-path-like-object).12411242#### `Path.walk(top_down=True, on_error=None, follow_symlinks=False)`12431244Генерирует имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх.12451246Для каждого каталога в дереве каталогов с корнем *self* (включая *self*, но исключая '.' и '..'), метод возвращает кортеж из 3 элементов: `(dirpath, dirnames, filenames)`.12471248*dirpath* – это [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path) к текущему обходимому каталогу, *dirnames* – список строк с именами подкаталогов в *dirpath* (исключая `'.'` и `'..'`), а *filenames* – список строк с именами файлов (не каталогов) в *dirpath*. Чтобы получить полный путь (начинающийся с *self*) к файлу или каталогу в *dirpath*, используйте `dirpath / name`. Отсортированы ли списки, зависит от файловой системы.12491250Если необязательный аргумент *top\_down* равен true (по умолчанию), тройка для каталога генерируется до троек для любых его подкаталогов (каталоги обходятся сверху вниз). Если *top\_down* равен false, тройка для каталога генерируется после троек для всех его подкаталогов (каталоги обходятся снизу вверх). Независимо от значения *top\_down*, список подкаталогов извлекается до того, как будут обойдены тройки для каталога и его подкаталогов.12511252Когда *top\_down* равен true, вызывающий код может изменить список *dirnames* на месте (например, с помощью [`del`](https://python-all.ru/3.14/reference/simple_stmts.html#del) или присваивания среза), и `Path.walk()` будет рекурсивно обходить только те подкаталоги, чьи имена остались в *dirnames*. Это можно использовать для обрезки поиска, наложения определённого порядка обхода или даже для информирования `Path.walk()` о каталогах, которые вызывающий код создаёт или переименовывает до того, как возобновит `Path.walk()` снова. Изменение *dirnames*, когда *top\_down* равен false, не влияет на поведение `Path.walk()`, поскольку каталоги в *dirnames* уже были сгенерированы к моменту, когда *dirnames* передаётся вызывающему коду.12531254По умолчанию ошибки [`os.scandir()`](https://python-all.ru/3.14/library/os.html#os.scandir) игнорируются. Если указан необязательный аргумент *on\_error*, это должен быть вызываемый объект; он будет вызван с одним аргументом – экземпляром [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError). Этот вызываемый объект может обработать ошибку, чтобы продолжить обход, или повторно возбудить её, чтобы остановить обход. Обратите внимание: имя файла доступно как атрибут `filename` объекта исключения.12551256По умолчанию `Path.walk()` не переходит по символическим ссылкам, а вместо этого добавляет их в список *filenames*. Установите *follow\_symlinks* в true, чтобы разрешать символические ссылки и помещать их в *dirnames* и *filenames* в соответствии с их целями, и, таким образом, обходить каталоги, на которые указывают символические ссылки (если это поддерживается).12571258> **Примечание**1259>1260> Имейте в виду, что установка *follow\_symlinks* в true может привести к бесконечной рекурсии, если ссылка указывает на родительский каталог самой себя. `Path.walk()` не отслеживает уже посещённые каталоги.12611262> **Примечание**1263>1264> `Path.walk()` предполагает, что обходимые им каталоги не изменяются во время выполнения. Например, если каталог из *dirnames* был заменён символической ссылкой, а *follow\_symlinks* равно false, `Path.walk()` всё равно попытается спуститься в него. Чтобы предотвратить такое поведение, удаляйте каталоги из *dirnames* по мере необходимости.12651266> **Примечание**1267>1268> В отличие от [`os.walk()`](https://python-all.ru/3.14/library/os.html#os.walk), `Path.walk()` перечисляет символические ссылки на каталоги в *filenames*, если *follow\_symlinks* равно false.12691270Этот пример показывает количество байтов, используемых всеми файлами в каждом каталоге, игнорируя каталоги `__pycache__`:12711272```python1273from pathlib import Path1274for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):1275  print(1276      root,1277      "consumes",1278      sum((root / file).stat().st_size for file in files),1279      "bytes in",1280      len(files),1281      "non-directory files"1282  )1283  if '__pycache__' in dirs:1284        dirs.remove('__pycache__')1285```12861287Следующий пример – простая реализация [`shutil.rmtree()`](https://python-all.ru/3.14/library/shutil.html#shutil.rmtree). Обход дерева снизу вверх необходим, поскольку [`rmdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rmdir) не позволяет удалить каталог, пока он не пуст:12881289```python1290# Удалить всё, доступное из каталога "top".1291# ВНИМАНИЕ: Это опасно! Например, если top == Path('/'),1292# это может удалить все файлы.1293for root, dirs, files in top.walk(top_down=False):1294    for name in files:1295        (root / name).unlink()1296    for name in dirs:1297        (root / name).rmdir()1298```12991300Добавлено в версии 3.12.13011302### Создание файлов и каталогов13031304#### `Path.touch(mode=0o666, exist_ok=True)`13051306Создаёт файл по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если файл уже существует, функция завершается успешно, когда *exist\_ok* равен true (время модификации обновляется до текущего), в противном случае возбуждается [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError).13071308> **См. также**1309>1310> Методы [`open()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.open), [`write_text()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.write_text) и [`write_bytes()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.write_bytes) часто используются для создания файлов.13111312#### `Path.mkdir(mode=0o777, parents=False, exist_ok=False)`13131314Создаёт новый каталог по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если путь уже существует, возбуждается [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError).13151316Если *parents* равен true, любые отсутствующие родительские каталоги этого пути создаются по мере необходимости; они создаются с правами по умолчанию без учёта *mode* (имитируя команду POSIX `mkdir -p`).13171318Если *parents* равен false (по умолчанию), отсутствие родительского каталога вызывает [`FileNotFoundError`](https://python-all.ru/3.14/library/exceptions.html#FileNotFoundError).13191320Если *exist\_ok* равен false (по умолчанию), [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError) возбуждается, если целевой каталог уже существует.13211322Если *exist\_ok* равен true, [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError) не будет возбуждаться, за исключением случая, когда указанный путь уже существует в файловой системе и не является каталогом (аналогично поведению команды POSIX `mkdir -p`).13231324Изменено в версии 3.5: Добавлен параметр *exist\_ok*.13251326#### `Path.symlink_to(target, target_is_directory=False)`13271328Делает этот путь символической ссылкой, указывающей на *target*.13291330В Windows символическая ссылка представляет собой файл или каталог и не изменяется динамически в соответствии с целью. Если цель существует, тип ссылки будет создан соответствующим. В противном случае ссылка будет создана как каталог, если *target\_is\_directory* равен true, или как файловая ссылка (по умолчанию) в противном случае. На платформах, отличных от Windows, *target\_is\_directory* игнорируется.13311332```python1333>>> p = Path('mylink')1334>>> p.symlink_to('setup.py')1335>>> p.resolve()1336PosixPath('/home/antoine/pathlib/setup.py')1337>>> p.stat().st_size13389561339>>> p.lstat().st_size134081341```13421343> **Примечание**1344>1345> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.symlink()`](https://python-all.ru/3.14/library/os.html#os.symlink).13461347Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.symlink()`](https://python-all.ru/3.14/library/os.html#os.symlink) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).13481349#### `Path.hardlink_to(target)`13501351Делает этот путь жёсткой ссылкой на тот же файл, что и *target*.13521353> **Примечание**1354>1355> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.link()`](https://python-all.ru/3.14/library/os.html#os.link).13561357Добавлено в версии 3.10.13581359Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation), если [`os.link()`](https://python-all.ru/3.14/library/os.html#os.link) недоступен. В предыдущих версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).13601361### Копирование, перемещение и удаление13621363#### `Path.copy(target, *, follow_symlinks=True, preserve_metadata=False)`13641365Копирует этот файл или дерево каталогов в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*.13661367Если источник является файлом, целевой объект будет заменён, если он уже существует. Если источник – символическая ссылка и *follow\_symlinks* равно true (по умолчанию), копируется объект, на который она указывает. В противном случае символическая ссылка воссоздаётся в месте назначения.13681369Если *preserve\_metadata* равно false (по умолчанию), гарантированно копируются только структура каталогов и данные файлов. Установите *preserve\_metadata* в true, чтобы при копировании также сохранялись права доступа к файлам и каталогам, флаги, время последнего доступа и изменения, а также расширенные атрибуты, где это поддерживается. Этот аргумент не влияет на копирование файлов в Windows (метаданные всегда сохраняются).13701371> **Примечание**1372>1373> Там, где это поддерживается операционной системой и файловой системой, этот метод выполняет облегчённое копирование, при котором блоки данных копируются только при их изменении. Это называется копированием при записи (copy-on-write).13741375Добавлено в версии 3.14.13761377#### `Path.copy_into(target_dir, *, follow_symlinks=True, preserve_metadata=False)`13781379Копирует этот файл или дерево каталогов в указанный *target\_dir*, который должен быть существующим каталогом. Остальные аргументы обрабатываются так же, как и в [`Path.copy()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.copy). Возвращает новый экземпляр `Path`, указывающий на копию.13801381Добавлено в версии 3.14.13821383#### `Path.rename(target)`13841385Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. В Unix, если *target* существует и является файлом, он будет молча заменён, если у пользователя есть разрешение. В Windows, если *target* существует, будет вызвано [`FileExistsError`](https://python-all.ru/3.14/library/exceptions.html#FileExistsError). *target* может быть строкой или другим объектом пути.13861387```python1388>>> p = Path('foo')1389>>> p.open('w').write('some text')139091391>>> target = Path('bar')1392>>> p.rename(target)1393PosixPath('bar')1394>>> target.open().read()1395'some text'1396```13971398Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.13991400Реализован через [`os.rename()`](https://python-all.ru/3.14/library/os.html#os.rename) и даёт те же гарантии.14011402Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.14031404#### `Path.replace(target)`14051406Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. Если *target* указывает на существующий файл или пустой каталог, он будет безусловно заменён.14071408Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.14091410Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.14111412#### `Path.move(target)`14131414Перемещает этот файл или дерево каталогов в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*.14151416Если *target* не существует, он будет создан. Если и этот путь, и *target* являются существующими файлами, то целевой файл будет перезаписан. Если оба пути указывают на один и тот же файл или каталог, или *target* является непустым каталогом, то вызывается [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError).14171418Если оба пути находятся в одной файловой системе, перемещение выполняется с помощью [`os.replace()`](https://python-all.ru/3.14/library/os.html#os.replace). В противном случае этот путь копируется (с сохранением метаданных и символических ссылок), а затем удаляется.14191420Добавлено в версии 3.14.14211422#### `Path.move_into(target_dir)`14231424Перемещает этот файл или дерево каталогов в указанный *target\_dir*, который должен быть существующим каталогом. Возвращает новый экземпляр `Path`, указывающий на перемещённый путь.14251426Добавлено в версии 3.14.14271428#### `Path.unlink(missing_ok=False)`14291430Удаляет этот файл или символическую ссылку. Если путь указывает на каталог, используйте [`Path.rmdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rmdir).14311432Если *missing\_ok* равно false (по умолчанию), [`FileNotFoundError`](https://python-all.ru/3.14/library/exceptions.html#FileNotFoundError) вызывается, если путь не существует.14331434Если *missing\_ok* равно true, исключения [`FileNotFoundError`](https://python-all.ru/3.14/library/exceptions.html#FileNotFoundError) будут игнорироваться (аналогично поведению команды POSIX `rm -f`).14351436Изменено в версии 3.8: Добавлен параметр *missing\_ok*.14371438#### `Path.rmdir()`14391440Удаляет этот каталог. Каталог должен быть пустым.14411442### Права доступа и владение14431444#### `Path.owner(*, follow_symlinks=True)`14451446Возвращает имя пользователя, владеющего файлом. [`KeyError`](https://python-all.ru/3.14/library/exceptions.html#KeyError) вызывается, если идентификатор пользователя (UID) файла не найден в системной базе данных.14471448Этот метод обычно следует символическим ссылкам; чтобы получить владельца самой символической ссылки, добавьте аргумент `follow_symlinks=False`.14491450Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`pwd`](https://python-all.ru/3.14/library/pwd.html#module-pwd) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).14511452Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.14531454#### `Path.group(*, follow_symlinks=True)`14551456Возвращает имя группы, владеющей файлом. [`KeyError`](https://python-all.ru/3.14/library/exceptions.html#KeyError) возбуждается, если идентификатор группы (GID) файла не найден в системной базе данных.14571458Этот метод обычно переходит по символьным ссылкам. Для получения группы самой символьной ссылки используется аргумент `follow_symlinks=False`.14591460Изменено в версии 3.13: Возбуждает [`UnsupportedOperation`](https://python-all.ru/3.14/library/pathlib.html#pathlib.UnsupportedOperation), если модуль [`grp`](https://python-all.ru/3.14/library/grp.html#module-grp) недоступен. В более ранних версиях возбуждалось [`NotImplementedError`](https://python-all.ru/3.14/library/exceptions.html#NotImplementedError).14611462Изменено в версии 3.13: Добавлен параметр *follow\_symlinks*.14631464#### `Path.chmod(mode, *, follow_symlinks=True)`14651466Изменяет режим и права доступа к файлу, как [`os.chmod()`](https://python-all.ru/3.14/library/os.html#os.chmod).14671468Этот метод обычно переходит по символьным ссылкам. Некоторые варианты Unix поддерживают изменение прав доступа на самой символьной ссылке; на таких платформах можно добавить аргумент `follow_symlinks=False` или использовать [`lchmod()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.lchmod).14691470```python1471>>> p = Path('setup.py')1472>>> p.stat().st_mode1473332771474>>> p.chmod(0o444)1475>>> p.stat().st_mode1476330601477```14781479Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.14801481#### `Path.lchmod(mode)`14821483Как [`Path.chmod()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.chmod), но если путь указывает на символьную ссылку, то изменяется режим самой символьной ссылки, а не её цели.14841485## Язык шаблонов14861487В шаблонах для [`full_match()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.full_match), [`glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rglob) поддерживаются следующие подстановочные знаки:14881489**`**` (весь сегмент)**14901491Соответствует любому количеству сегментов файлов или каталогов, включая ноль.14921493**`*` (весь сегмент)**14941495Соответствует одному сегменту файла или каталога.14961497**`*` (часть сегмента)**14981499Соответствует любому количеству символов, не являющихся разделителями, включая ноль.15001501**`?`**15021503Соответствует одному символу, не являющемуся разделителем.15041505**`[seq]`**15061507Соответствует одному символу из *seq*, где *seq* – это последовательность символов. Поддерживаются диапазонные выражения; например, `[a-z]` соответствует любой строчной букве ASCII. Можно комбинировать несколько диапазонов: `[a-zA-Z0-9_]` соответствует любой букве ASCII, цифре или знаку подчеркивания.15081509**`[!seq]`**15101511Соответствует одному символу, не входящему в *seq*, где правила для *seq* такие же, как выше.15121513Для точного совпадения заключите метасимволы в скобки. Например, `"[?]"` соответствует символу `"?"`.15141515Подстановочный знак «`**`» включает рекурсивный поиск по шаблону. Несколько примеров:15161517| Шаблон | Значение |1518| --- | --- |1519| “`**/*`” | Любой путь, содержащий хотя бы один сегмент. |1520| “`**/*.py`” | Любой путь, последний сегмент которого заканчивается на «`.py`». |1521| “`assets/**`” | Любой путь, начинающийся с «`assets/`». |1522| “`assets/**/*`” | Любой путь, начинающийся с «`assets/`», за исключением самого «`assets/`». |15231524> **Примечание**1525>1526> Поиск по шаблону с использованием подстановочного знака «`**`» проходит по каждому каталогу в дереве. Большие деревья каталогов могут требовать много времени на поиск.15271528Изменено в версии 3.13: Поиск по шаблону, оканчивающемуся на «`**`», возвращает как файлы, так и каталоги. В предыдущих версиях возвращались только каталоги.15291530В [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) и [`rglob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rglob) к шаблону может быть добавлена конечная косая черта для соответствия только каталогам.15311532Изменено в версии 3.11: Поиск по шаблону, оканчивающемуся на разделитель компонентов пути ([`sep`](https://python-all.ru/3.14/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.14/library/os.html#os.altsep)), возвращает только каталоги.15331534## Сравнение с модулем [`glob`](https://python-all.ru/3.14/library/glob.html#module-glob)15351536Шаблоны, принимаемые [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rglob), и генерируемые ими результаты немного отличаются от результатов модуля [`glob`](https://python-all.ru/3.14/library/glob.html#module-glob):153715381. Файлы, начинающиеся с точки, не являются особыми в pathlib. Это аналогично передаче `include_hidden=True` в [`glob.glob()`](https://python-all.ru/3.14/library/glob.html#glob.glob).15392. Компоненты шаблона «`**`» в pathlib всегда рекурсивны. Это аналогично передаче `recursive=True` в [`glob.glob()`](https://python-all.ru/3.14/library/glob.html#glob.glob).15403. Компоненты шаблона «`**`» по умолчанию не переходят по символическим ссылкам в pathlib. Это поведение не имеет аналога в [`glob.glob()`](https://python-all.ru/3.14/library/glob.html#glob.glob), но можно передать `recurse_symlinks=True` в [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) для совместимого поведения.15414. Как и все объекты [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path), значения, возвращаемые из [`Path.glob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.glob) и [`Path.rglob()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rglob), не содержат завершающих слешей.15425. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, включают *путь* в качестве префикса, в отличие от результатов `glob.glob(root_dir=path)`.15436. Значения, возвращаемые методами pathlib `path.glob()` и `path.rglob()`, могут включать сам *путь*, например, при поиске по шаблону «`**`», тогда как результаты `glob.glob(root_dir=path)` никогда не включают пустую строку, которая соответствовала бы *пути*.15441545## Сравнение с модулями [`os`](https://python-all.ru/3.14/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path)15461547pathlib реализует операции с путями, используя объекты [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath) и [`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path), и поэтому считается *объектно-ориентированным*. С другой стороны, модули [`os`](https://python-all.ru/3.14/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path) предоставляют функции, работающие с низкоуровневыми объектами `str` и `bytes`, что является более *процедурным* подходом. Некоторые пользователи считают объектно-ориентированный стиль более читаемым.15481549Многие функции в [`os`](https://python-all.ru/3.14/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path) поддерживают пути `bytes` и [пути, относительные относительно дескрипторов каталогов](https://python-all.ru/3.14/library/os.html#dir-fd). Эти возможности недоступны в pathlib.15501551Типы `str` и `bytes`, а также части модулей [`os`](https://python-all.ru/3.14/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path), написаны на C и очень быстры. pathlib написан на чистом Python и обычно работает медленнее, но редко настолько, чтобы это было существенно.15521553Нормализация путей в pathlib немного более строгая и последовательная, чем в [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path). Например, тогда как [`os.path.abspath()`](https://python-all.ru/3.14/library/os.path.html#os.path.abspath) удаляет сегменты «`..`» из пути, что может изменить его значение при наличии символических ссылок, [`Path.absolute()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.absolute) сохраняет эти сегменты для большей безопасности.15541555Нормализация путей в pathlib может сделать её непригодной для некоторых приложений:155615571. pathlib нормализует `Path("my_folder/")` в `Path("my_folder")`, что меняет значение пути при передаче в различные API операционной системы и командной строки. В частности, отсутствие завершающего разделителя может позволить разрешить путь как файл или каталог, а не только как каталог.15582. pathlib нормализует `Path("./my_program")` в `Path("my_program")`, что меняет значение пути при использовании в качестве пути поиска исполняемых файлов, например в оболочке или при порождении дочернего процесса. В частности, отсутствие разделителя в пути может заставить искать его в `PATH` вместо текущего каталога.15591560Вследствие этих различий pathlib не является прямой заменой для [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path).15611562### Соответствующие инструменты15631564Ниже представлена таблица, сопоставляющая различные функции [`os`](https://python-all.ru/3.14/library/os.html#module-os) с их эквивалентами в [`PurePath`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath)/[`Path`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path).15651566| [`os`](https://python-all.ru/3.14/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.14/library/os.path.html#module-os.path) | `pathlib` |1567| --- | --- |1568| [`os.path.dirname()`](https://python-all.ru/3.14/library/os.path.html#os.path.dirname) | [`PurePath.parent`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.parent) |1569| [`os.path.basename()`](https://python-all.ru/3.14/library/os.path.html#os.path.basename) | [`PurePath.name`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.name) |1570| [`os.path.splitext()`](https://python-all.ru/3.14/library/os.path.html#os.path.splitext) | [`PurePath.stem`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.stem), [`PurePath.suffix`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.suffix) |1571| [`os.path.join()`](https://python-all.ru/3.14/library/os.path.html#os.path.join) | [`PurePath.joinpath()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.joinpath) |1572| [`os.path.isabs()`](https://python-all.ru/3.14/library/os.path.html#os.path.isabs) | [`PurePath.is_absolute()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.is_absolute) |1573| [`os.path.relpath()`](https://python-all.ru/3.14/library/os.path.html#os.path.relpath) | [`PurePath.relative_to()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.relative_to) [\[1\]](https://python-all.ru/3.14/library/pathlib.html#id7) |1574| [`os.path.expanduser()`](https://python-all.ru/3.14/library/os.path.html#os.path.expanduser) | [`Path.expanduser()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.expanduser) [\[2\]](https://python-all.ru/3.14/library/pathlib.html#id8) |1575| [`os.path.realpath()`](https://python-all.ru/3.14/library/os.path.html#os.path.realpath) | [`Path.resolve()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.resolve) |1576| [`os.path.abspath()`](https://python-all.ru/3.14/library/os.path.html#os.path.abspath) | [`Path.absolute()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.absolute) [\[3\]](https://python-all.ru/3.14/library/pathlib.html#id9) |1577| [`os.path.exists()`](https://python-all.ru/3.14/library/os.path.html#os.path.exists) | [`Path.exists()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.exists) |1578| [`os.path.isfile()`](https://python-all.ru/3.14/library/os.path.html#os.path.isfile) | [`Path.is_file()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_file) |1579| [`os.path.isdir()`](https://python-all.ru/3.14/library/os.path.html#os.path.isdir) | [`Path.is_dir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_dir) |1580| [`os.path.islink()`](https://python-all.ru/3.14/library/os.path.html#os.path.islink) | [`Path.is_symlink()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_symlink) |1581| [`os.path.isjunction()`](https://python-all.ru/3.14/library/os.path.html#os.path.isjunction) | [`Path.is_junction()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_junction) |1582| [`os.path.ismount()`](https://python-all.ru/3.14/library/os.path.html#os.path.ismount) | [`Path.is_mount()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.is_mount) |1583| [`os.path.samefile()`](https://python-all.ru/3.14/library/os.path.html#os.path.samefile) | [`Path.samefile()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.samefile) |1584| [`os.getcwd()`](https://python-all.ru/3.14/library/os.html#os.getcwd) | [`Path.cwd()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.cwd) |1585| [`os.stat()`](https://python-all.ru/3.14/library/os.html#os.stat) | [`Path.stat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.stat) |1586| [`os.lstat()`](https://python-all.ru/3.14/library/os.html#os.lstat) | [`Path.lstat()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.lstat) |1587| [`os.listdir()`](https://python-all.ru/3.14/library/os.html#os.listdir) | [`Path.iterdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.iterdir) |1588| [`os.walk()`](https://python-all.ru/3.14/library/os.html#os.walk) | [`Path.walk()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.walk) [\[4\]](https://python-all.ru/3.14/library/pathlib.html#id10) |1589| [`os.mkdir()`](https://python-all.ru/3.14/library/os.html#os.mkdir), [`os.makedirs()`](https://python-all.ru/3.14/library/os.html#os.makedirs) | [`Path.mkdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.mkdir) |1590| [`os.link()`](https://python-all.ru/3.14/library/os.html#os.link) | [`Path.hardlink_to()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.hardlink_to) |1591| [`os.symlink()`](https://python-all.ru/3.14/library/os.html#os.symlink) | [`Path.symlink_to()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.symlink_to) |1592| [`os.readlink()`](https://python-all.ru/3.14/library/os.html#os.readlink) | [`Path.readlink()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.readlink) |1593| [`os.rename()`](https://python-all.ru/3.14/library/os.html#os.rename) | [`Path.rename()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rename) |1594| [`os.replace()`](https://python-all.ru/3.14/library/os.html#os.replace) | [`Path.replace()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.replace) |1595| [`os.remove()`](https://python-all.ru/3.14/library/os.html#os.remove), [`os.unlink()`](https://python-all.ru/3.14/library/os.html#os.unlink) | [`Path.unlink()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.unlink) |1596| [`os.rmdir()`](https://python-all.ru/3.14/library/os.html#os.rmdir) | [`Path.rmdir()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.rmdir) |1597| [`os.chmod()`](https://python-all.ru/3.14/library/os.html#os.chmod) | [`Path.chmod()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.chmod) |1598| [`os.lchmod()`](https://python-all.ru/3.14/library/os.html#os.lchmod) | [`Path.lchmod()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.lchmod) |15991600Сноски16011602\[[1](https://python-all.ru/3.14/library/pathlib.html#id3)\]16031604[`os.path.relpath()`](https://python-all.ru/3.14/library/os.path.html#os.path.relpath) вызывает [`abspath()`](https://python-all.ru/3.14/library/os.path.html#os.path.abspath), чтобы сделать пути абсолютными и удалить части «`..`», тогда как [`PurePath.relative_to()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.PurePath.relative_to) является лексической операцией, которая возбуждает [`ValueError`](https://python-all.ru/3.14/library/exceptions.html#ValueError), когда якоря входных путей различаются (например, если один путь абсолютный, а другой относительный).16051606\[[2](https://python-all.ru/3.14/library/pathlib.html#id4)\]16071608[`os.path.expanduser()`](https://python-all.ru/3.14/library/os.path.html#os.path.expanduser) возвращает путь без изменений, если домашний каталог не может быть определён, тогда как [`Path.expanduser()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.expanduser) возбуждает [`RuntimeError`](https://python-all.ru/3.14/library/exceptions.html#RuntimeError).16091610\[[3](https://python-all.ru/3.14/library/pathlib.html#id5)\]16111612[`os.path.abspath()`](https://python-all.ru/3.14/library/os.path.html#os.path.abspath) удаляет компоненты «`..`» без разрешения символических ссылок, что может изменить значение пути, тогда как [`Path.absolute()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.absolute) оставляет любые компоненты «`..`» в пути.16131614\[[4](https://python-all.ru/3.14/library/pathlib.html#id6)\]16151616[`os.walk()`](https://python-all.ru/3.14/library/os.html#os.walk) всегда следует символьным ссылкам при разбиении путей на *имена каталогов* и *имена файлов*, тогда как [`Path.walk()`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.walk) классифицирует все символьные ссылки как *имена файлов*, когда *follow\_symlinks* равен false (по умолчанию).16171618## Протоколы16191620Модуль `pathlib.types` предоставляет типы для статической проверки типов.16211622Добавлено в версии 3.14.16231624#### `class pathlib.types.PathInfo`16251626[`typing.Protocol`](https://python-all.ru/3.14/library/typing.html#typing.Protocol), описывающий атрибут [`Path.info`](https://python-all.ru/3.14/library/pathlib.html#pathlib.Path.info). Реализации могут возвращать кэшированные результаты из своих методов.16271628#### `exists(*, follow_symlinks=True)`16291630Возвращает `True`, если путь является существующим файлом, каталогом или любым другим типом файла; возвращает `False`, если путь не существует.16311632Если *follow\_symlinks* равен `False`, возвращает `True` для символьных ссылок без проверки существования их целей.16331634#### `is_dir(*, follow_symlinks=True)`16351636Возвращает `True`, если путь является каталогом или символьной ссылкой, указывающей на каталог; возвращает `False`, если путь является (или указывает на) любой другой тип файла, или если он не существует.16371638Если *follow\_symlinks* равен `False`, возвращает `True` только если путь является каталогом (без перехода по символьным ссылкам); возвращает `False`, если путь является любым другим типом файла, или если он не существует.16391640#### `is_file(*, follow_symlinks=True)`16411642Возвращает `True`, если путь является файлом или символической ссылкой на файл; возвращает `False`, если путь является (или указывает на) каталог или другой не-файл, или если он не существует.16431644Если *follow\_symlinks* равно `False`, возвращает `True` только если путь является файлом (без перехода по символическим ссылкам); возвращает `False`, если путь является каталогом или другим не-файлом, или если он не существует.16451646#### `is_symlink()`16471648Возвращает `True`, если путь является символической ссылкой (даже битой); возвращает `False`, если путь является каталогом или любым типом файла, или если он не существует.1649