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

pathlib.md

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

1> **Источник:** https://python-all.ru/3.12/library/pathlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `pathlib` – Объектно-ориентированные пути файловой системы89Добавлено в версии 3.4.1011**Исходный код:** [Lib/pathlib.py](https://python-all.ru/src/3.12/Lib/pathlib.py)1213---1415Этот модуль предоставляет классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на [чистые пути](https://python-all.ru/3.12/library/pathlib.html#pure-paths), которые выполняют только вычислительные операции без ввода-вывода, и [конкретные пути](https://python-all.ru/3.12/library/pathlib.html#concrete-paths), которые наследуют чистые пути, но также предоставляют операции ввода-вывода.1617![Диаграмма наследования, показывающая классы, доступные в pathlib. Самый базовый класс – PurePath, у которого есть три непосредственных подкласса: PurePosixPath, PureWindowsPath и Path. Кроме этих четырёх классов, есть два класса, использующих множественное наследование: PosixPath наследует от PurePosixPath и Path, а WindowsPath наследует от PureWindowsPath и Path.](https://python-all.ru/3.12/_images/pathlib-inheritance.png)1819Если вы никогда не пользовались этим модулем раньше или просто не уверены, какой класс подходит для вашей задачи, скорее всего, вам нужен [`Path`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path). Он создаёт экземпляр [конкретного пути](https://python-all.ru/3.12/library/pathlib.html#concrete-paths) для платформы, на которой выполняется код.2021Чистые пути полезны в некоторых особых случаях; например:22231. Если требуется манипулировать путями Windows на машине Unix (или наоборот). При работе на Unix нельзя создать экземпляр [`WindowsPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.WindowsPath), но можно создать [`PureWindowsPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PureWindowsPath).242. Если нужно, чтобы код только манипулировал путями без фактического обращения к ОС. В таком случае может быть полезно создать экземпляр одного из чистых классов, поскольку они просто не имеют операций доступа к ОС.2526> **См. также**27>28> [**PEP 428**](https://python-all.ru/3.12/library/pathlib.html): модуль pathlib – объектно-ориентированные пути файловой системы.2930> **См. также**31>32> Для низкоуровневых манипуляций с путями в виде строк можно также использовать модуль [`os.path`](https://python-all.ru/3.12/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Объекты чистых путей предоставляют операции обработки путей, которые не обращаются к файловой системе. Существует три способа доступа к этим классам, которые также называются *разновидностями*:9192#### `class pathlib.PurePath(*pathsegments)`9394Общий класс, представляющий разновидность пути системы (при создании экземпляра создаётся либо [`PurePosixPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePosixPath), либо [`PureWindowsPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PureWindowsPath)):9596```python97>>> PurePath('setup.py')      # Запуск на Unix-машине98PurePosixPath('setup.py')99```100101Каждый элемент *pathsegments* может быть либо строкой, представляющей сегмент пути, либо объектом, реализующим интерфейс [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike), где метод [`__fspath__()`](https://python-all.ru/3.12/library/os.html#os.PathLike.__fspath__) возвращает строку, например, другой объект пути:102103```python104>>> PurePath('foo', 'some/path', 'bar')105PurePosixPath('foo/some/path/bar')106>>> PurePath(Path('foo'), Path('bar'))107PurePosixPath('foo/bar')108```109110Когда *pathsegments* пуст, подразумевается текущий каталог:111112```python113>>> PurePath()114PurePosixPath('.')115```116117Если сегмент является абсолютным путём, все предыдущие сегменты игнорируются (как [`os.path.join()`](https://python-all.ru/3.12/library/os.path.html#os.path.join)):118119```python120>>> PurePath('/etc', '/usr', 'lib64')121PurePosixPath('/usr/lib64')122>>> PureWindowsPath('c:/Windows', 'd:bar')123PureWindowsPath('d:bar')124```125126В Windows диск не сбрасывается при обнаружении корневого относительного сегмента пути (например, `r'\foo'`):127128```python129>>> PureWindowsPath('c:/Windows', '/Program Files')130PureWindowsPath('c:/Program Files')131```132133Лишние косые черты и одиночные точки схлопываются, но двойные точки (`'..'`) и начальные двойные косые черты (`'//'`) – нет, поскольку это изменило бы значение пути по разным причинам (например, символические ссылки, UNC-пути):134135```python136>>> PurePath('foo//bar')137PurePosixPath('foo/bar')138>>> PurePath('//foo/bar')139PurePosixPath('//foo/bar')140>>> PurePath('foo/./bar')141PurePosixPath('foo/bar')142>>> PurePath('foo/../bar')143PurePosixPath('foo/../bar')144```145146(наивный подход сделал бы `PurePosixPath('foo/../bar')` эквивалентным `PurePosixPath('bar')`, что неверно, если `foo` является символической ссылкой на другой каталог)147148Объекты чистых путей реализуют интерфейс [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike), что позволяет использовать их везде, где этот интерфейс принимается.149150Изменено в версии 3.6: Добавлена поддержка интерфейса [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike).151152#### `class pathlib.PurePosixPath(*pathsegments)`153154Подкласс [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы, отличные от Windows:155156```python157>>> PurePosixPath('/etc/hosts')158PurePosixPath('/etc/hosts')159```160161Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath).162163#### `class pathlib.PureWindowsPath(*pathsegments)`164165Подкласс [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath), эта разновидность путей представляет пути файловой системы Windows, включая [UNC-пути](https://python-all.ru/3.12/library/pathlib.html):166167```python168>>> PureWindowsPath('c:/', 'Users', 'Ximénez')169PureWindowsPath('c:/Users/Ximénez')170>>> PureWindowsPath('//server/share/file')171PureWindowsPath('//server/share/file')172```173174Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath).175176Независимо от используемой системы можно создавать экземпляры всех этих классов, поскольку они не предоставляют никаких операций, совершающих системные вызовы.177178### Общие свойства179180Пути неизменяемы и [хэшируемые](https://python-all.ru/3.12/glossary.html#term-hashable). Пути одной разновидности сравнимы и упорядочиваемы. Эти свойства учитывают семантику приведения регистра данной разновидности:181182```python183>>> PurePosixPath('foo') == PurePosixPath('FOO')184False185>>> PureWindowsPath('foo') == PureWindowsPath('FOO')186True187>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }188True189>>> PureWindowsPath('C:') < PureWindowsPath('d:')190True191```192193Пути разных разновидностей неравны и не упорядочиваются:194195```python196>>> PureWindowsPath('foo') == PurePosixPath('foo')197False198>>> PureWindowsPath('foo') < PurePosixPath('foo')199Traceback (most recent call last):200  File "<stdin>", line 1, in <module>201TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'202```203204### Операторы205206Оператор косой черты помогает создавать дочерние пути, например [`os.path.join()`](https://python-all.ru/3.12/library/os.path.html#os.path.join). Если аргумент является абсолютным путём, предыдущий путь игнорируется. В Windows диск не сбрасывается, если аргумент является относительным путём с корнем (например, `r'\foo'`):207208```python209>>> p = PurePath('/etc')210>>> p211PurePosixPath('/etc')212>>> p / 'init.d' / 'apache2'213PurePosixPath('/etc/init.d/apache2')214>>> q = PurePath('bin')215>>> '/usr' / q216PurePosixPath('/usr/bin')217>>> p / '/an_absolute_path'218PurePosixPath('/an_absolute_path')219>>> PureWindowsPath('c:/Windows', '/Program Files')220PureWindowsPath('c:/Program Files')221```222223Объект пути можно использовать везде, где принимается объект, реализующий [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike):224225```python226>>> import os227>>> p = PurePath('/etc')228>>> os.fspath(p)229'/etc'230```231232Строковое представление пути – это сам сырой путь файловой системы (в нативном виде, например с обратными слешами в Windows), который можно передать любой функции, принимающей путь к файлу в виде строки:233234```python235>>> p = PurePath('/etc')236>>> str(p)237'/etc'238>>> p = PureWindowsPath('c:/Program Files')239>>> str(p)240'c:\\Program Files'241```242243Аналогично, вызов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) для пути возвращает сырой путь файловой системы в виде объекта bytes, закодированный с помощью [`os.fsencode()`](https://python-all.ru/3.12/library/os.html#os.fsencode):244245```python246>>> bytes(p)247b'/etc'248```249250> **Примечание**251>252> Вызов [`bytes`](https://python-all.ru/3.12/library/stdtypes.html#bytes) рекомендуется только в Unix. В Windows форма Unicode является каноническим представлением путей файловой системы.253254### Доступ к отдельным частям255256Для доступа к отдельным «частям» (компонентам) пути используйте следующее свойство:257258#### `PurePath.parts`259260Кортеж, предоставляющий доступ к различным компонентам пути:261262```python263>>> p = PurePath('/usr/bin/python3')264>>> p.parts265('/', 'usr', 'bin', 'python3')266267>>> p = PureWindowsPath('c:/Program Files/PSF')268>>> p.parts269('c:\\', 'Program Files', 'PSF')270```271272(обратите внимание, как диск и локальный корень объединены в одну часть)273274### Методы и свойства275276Чистые пути предоставляют следующие методы и свойства:277278#### `PurePath.drive`279280Строка, представляющая букву или имя диска, если таковой имеется:281282```python283>>> PureWindowsPath('c:/Program Files/').drive284'c:'285>>> PureWindowsPath('/Program Files/').drive286''287>>> PurePosixPath('/etc').drive288''289```290291UNC-ресурсы также считаются дисками:292293```python294>>> PureWindowsPath('//host/share/foo.txt').drive295'\\\\host\\share'296```297298#### `PurePath.root`299300Строка, представляющая (локальный или глобальный) корень, если таковой имеется:301302```python303>>> PureWindowsPath('c:/Program Files/').root304'\\'305>>> PureWindowsPath('c:Program Files/').root306''307>>> PurePosixPath('/etc').root308'/'309```310311UNC-ресурсы всегда имеют корень:312313```python314>>> PureWindowsPath('//host/share').root315'\\'316```317318Если путь начинается с более чем двух последовательных слешей, [`PurePosixPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePosixPath) схлопывает их:319320```python321>>> PurePosixPath('//etc').root322'//'323>>> PurePosixPath('///etc').root324'/'325>>> PurePosixPath('////etc').root326'/'327```328329> **Примечание**330>331> Это поведение соответствует *The Open Group Base Specifications Issue 6*, пункту [4.11 Pathname Resolution](https://python-all.ru/3.12/library/pathlib.html):332>333> *«Имя пути, начинающееся с двух последовательных слешей, может интерпретироваться способом, определяемым реализацией, хотя более двух начальных слешей должны рассматриваться как один слеш.»*334335#### `PurePath.anchor`336337Объединение диска и корневого каталога:338339```python340>>> PureWindowsPath('c:/Program Files/').anchor341'c:\\'342>>> PureWindowsPath('c:Program Files/').anchor343'c:'344>>> PurePosixPath('/etc').anchor345'/'346>>> PureWindowsPath('//host/share').anchor347'\\\\host\\share\\'348```349350#### `PurePath.parents`351352Неизменяемая последовательность, обеспечивающая доступ к логическим предкам пути:353354```python355>>> p = PureWindowsPath('c:/foo/bar/setup.py')356>>> p.parents[0]357PureWindowsPath('c:/foo/bar')358>>> p.parents[1]359PureWindowsPath('c:/foo')360>>> p.parents[2]361PureWindowsPath('c:/')362```363364Изменено в версии 3.10: Последовательность parents теперь поддерживает [срезы](https://python-all.ru/3.12/glossary.html#term-slice) и отрицательные значения индексов.365366#### `PurePath.parent`367368Логический родитель пути:369370```python371>>> p = PurePosixPath('/a/b/c/d')372>>> p.parent373PurePosixPath('/a/b/c')374```375376Нельзя выйти за пределы anchor или пустого пути:377378```python379>>> p = PurePosixPath('/')380>>> p.parent381PurePosixPath('/')382>>> p = PurePosixPath('.')383>>> p.parent384PurePosixPath('.')385```386387> **Примечание**388>389> Это чисто лексическая операция, поэтому поведение следующее:390>391> ```python392> >>> p = PurePosixPath('foo/..')393> >>> p.parent394> PurePosixPath('foo')395> ```396>397> Если нужно подняться вверх по произвольному пути файловой системы, рекомендуется сначала вызвать [`Path.resolve()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.resolve), чтобы разрешить символические ссылки и убрать компоненты `".."`.398399#### `PurePath.name`400401Строка, представляющая последний компонент пути, исключая диск и корневой каталог (если они есть):402403```python404>>> PurePosixPath('my/library/setup.py').name405'setup.py'406```407408UNC-имена дисков не учитываются:409410```python411>>> PureWindowsPath('//some/share/setup.py').name412'setup.py'413>>> PureWindowsPath('//some/share').name414''415```416417#### `PurePath.suffix`418419Расширение файла последнего компонента, если таковое имеется:420421```python422>>> PurePosixPath('my/library/setup.py').suffix423'.py'424>>> PurePosixPath('my/library.tar.gz').suffix425'.gz'426>>> PurePosixPath('my/library').suffix427''428```429430#### `PurePath.suffixes`431432Список расширений файлов пути:433434```python435>>> PurePosixPath('my/library.tar.gar').suffixes436['.tar', '.gar']437>>> PurePosixPath('my/library.tar.gz').suffixes438['.tar', '.gz']439>>> PurePosixPath('my/library').suffixes440[]441```442443#### `PurePath.stem`444445Последний компонент пути без суффикса:446447```python448>>> PurePosixPath('my/library.tar.gz').stem449'library.tar'450>>> PurePosixPath('my/library.tar').stem451'library'452>>> PurePosixPath('my/library').stem453'library'454```455456#### `PurePath.as_posix()`457458Возвращает строковое представление пути с прямыми слэшами (`/`):459460```python461>>> p = PureWindowsPath('c:\\windows')462>>> str(p)463'c:\\windows'464>>> p.as_posix()465'c:/windows'466```467468#### `PurePath.as_uri()`469470Представляет путь в виде `file` URI. [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) возбуждается, если путь не является абсолютным.471472```python473>>> p = PurePosixPath('/etc/passwd')474>>> p.as_uri()475'file:///etc/passwd'476>>> p = PureWindowsPath('c:/Windows')477>>> p.as_uri()478'file:///c:/Windows'479```480481#### `PurePath.is_absolute()`482483Возвращает, является ли путь абсолютным. Путь считается абсолютным, если у него есть и корень, и (если это допускает разновидность) диск:484485```python486>>> PurePosixPath('/a/b').is_absolute()487True488>>> PurePosixPath('a/b').is_absolute()489False490491>>> PureWindowsPath('c:/a/b').is_absolute()492True493>>> PureWindowsPath('/a/b').is_absolute()494False495>>> PureWindowsPath('c:').is_absolute()496False497>>> PureWindowsPath('//some/share').is_absolute()498True499```500501#### `PurePath.is_relative_to(other)`502503Возвращает, является ли этот путь относительным по отношению к пути *other*.504505```python506>>> p = PurePath('/etc/passwd')507>>> p.is_relative_to('/etc')508True509>>> p.is_relative_to('/usr')510False511```512513Этот метод основан на строках; он не обращается к файловой системе и не обрабатывает сегменты “`..`” особым образом. Следующий код эквивалентен:514515```python516>>> u = PurePath('/usr')517>>> u == p or u in p.parents518False519```520521Добавлено в версии 3.9.522523Устарело с версии 3.12, будет удалено в версии 3.14: Передача дополнительных аргументов устарела; если они указаны, они объединяются с *other*.524525#### `PurePath.is_reserved()`526527С [`PureWindowsPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PureWindowsPath) возвращает `True`, если путь считается зарезервированным в Windows, иначе `False`. С [`PurePosixPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePosixPath) всегда возвращается `False`.528529```python530>>> PureWindowsPath('nul').is_reserved()531True532>>> PurePosixPath('nul').is_reserved()533False534```535536Вызовы файловой системы для зарезервированных путей могут приводить к неожиданным ошибкам или непредвиденным последствиям.537538#### `PurePath.joinpath(*pathsegments)`539540Вызов этого метода эквивалентен последовательному объединению пути с каждым из указанных *pathsegments*:541542```python543>>> PurePosixPath('/etc').joinpath('passwd')544PurePosixPath('/etc/passwd')545>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))546PurePosixPath('/etc/passwd')547>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')548PurePosixPath('/etc/init.d/apache2')549>>> PureWindowsPath('c:').joinpath('/Program Files')550PureWindowsPath('c:/Program Files')551```552553#### `PurePath.match(pattern, *, case_sensitive=None)`554555Сопоставляет этот путь с предоставленным шаблоном в стиле glob. Возвращает `True` в случае успешного сопоставления, иначе `False`.556557Если *pattern* является относительным, путь может быть как относительным, так и абсолютным, и сопоставление выполняется с правого конца:558559```python560>>> PurePath('a/b.py').match('*.py')561True562>>> PurePath('/a/b/c.py').match('b/*.py')563True564>>> PurePath('/a/b/c.py').match('a/*.py')565False566```567568Если *pattern* является абсолютным, путь должен быть абсолютным, и должен совпадать весь путь:569570```python571>>> PurePath('/a.py').match('/*.py')572True573>>> PurePath('a/b.py').match('/*.py')574False575```576577В качестве *pattern* может выступать другой объект пути; это ускоряет сопоставление одного и того же шаблона с несколькими файлами:578579```python580>>> pattern = PurePath('*.py')581>>> PurePath('a/b.py').match(pattern)582True583```584585> **Примечание**586>587> Рекурсивный шаблон «`**`» не поддерживается этим методом (он работает как нерекурсивный «`*`»).588589Изменено в версии 3.12: Принимает объект, реализующий интерфейс [`os.PathLike`](https://python-all.ru/3.12/library/os.html#os.PathLike).590591Как и в других методах, чувствительность к регистру определяется по умолчанию платформой:592593```python594>>> PurePosixPath('b.py').match('*.PY')595False596>>> PureWindowsPath('b.py').match('*.PY')597True598```599600Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.601602Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.603604#### `PurePath.relative_to(other, walk_up=False)`605606Вычисляет версию этого пути, относительную пути, представленному *other*. Если это невозможно, вызывается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError):607608```python609>>> p = PurePosixPath('/etc/passwd')610>>> p.relative_to('/')611PurePosixPath('etc/passwd')612>>> p.relative_to('/etc')613PurePosixPath('passwd')614>>> p.relative_to('/usr')615Traceback (most recent call last):616  File "<stdin>", line 1, in <module>617  File "pathlib.py", line 941, in relative_to618    raise ValueError(error_message.format(str(self), str(formatted)))619ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.620```621622Когда *walk\_up* равно false (по умолчанию), путь должен начинаться с *other*. Когда аргумент true, могут быть добавлены элементы `..` для формирования относительного пути. Во всех остальных случаях, например, когда пути ссылаются на разные диски, вызывается [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError):623624```python625>>> p.relative_to('/usr', walk_up=True)626PurePosixPath('../etc/passwd')627>>> p.relative_to('foo', walk_up=True)628Traceback (most recent call last):629  File "<stdin>", line 1, in <module>630  File "pathlib.py", line 941, in relative_to631    raise ValueError(error_message.format(str(self), str(formatted)))632ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.633```634635> **Предупреждение**636>637> Эта функция является частью [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath) и работает со строками. Она не проверяет и не обращается к нижележащей файловой структуре. Это может повлиять на опцию *walk\_up*, так как предполагается, что в пути нет символических ссылок; при необходимости сначала вызовите [`resolve()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.resolve) для разрешения символьных ссылок.638639Изменено в версии 3.12: Добавлен параметр *walk\_up* (старое поведение эквивалентно `walk_up=False`).640641Устарело с версии 3.12, будет удалено в версии 3.14: Передача дополнительных позиционных аргументов устарела; если они указаны, они объединяются с *other*.642643#### `PurePath.with_name(name)`644645Возвращает новый путь с изменённым [`name`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.name). Если у исходного пути нет имени, вызывается ValueError:646647```python648>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')649>>> p.with_name('setup.py')650PureWindowsPath('c:/Downloads/setup.py')651>>> p = PureWindowsPath('c:/')652>>> p.with_name('setup.py')653Traceback (most recent call last):654  File "<stdin>", line 1, in <module>655  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name656    raise ValueError("%r has an empty name" % (self,))657ValueError: PureWindowsPath('c:/') has an empty name658```659660#### `PurePath.with_stem(stem)`661662Возвращает новый путь с изменённым [`stem`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.stem). Если у исходного пути нет имени, вызывается ValueError:663664```python665>>> p = PureWindowsPath('c:/Downloads/draft.txt')666>>> p.with_stem('final')667PureWindowsPath('c:/Downloads/final.txt')668>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')669>>> p.with_stem('lib')670PureWindowsPath('c:/Downloads/lib.gz')671>>> p = PureWindowsPath('c:/')672>>> p.with_stem('')673Traceback (most recent call last):674  File "<stdin>", line 1, in <module>675  File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem676    return self.with_name(stem + self.suffix)677  File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name678    raise ValueError("%r has an empty name" % (self,))679ValueError: PureWindowsPath('c:/') has an empty name680```681682Добавлено в версии 3.9.683684#### `PurePath.with_suffix(suffix)`685686Возвращает новый путь с изменённым [`suffix`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.suffix). Если у исходного пути нет суффикса, вместо него добавляется новый *suffix*. Если *suffix* – пустая строка, исходный суффикс удаляется:687688```python689>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')690>>> p.with_suffix('.bz2')691PureWindowsPath('c:/Downloads/pathlib.tar.bz2')692>>> p = PureWindowsPath('README')693>>> p.with_suffix('.txt')694PureWindowsPath('README.txt')695>>> p = PureWindowsPath('README.txt')696>>> p.with_suffix('')697PureWindowsPath('README')698```699700#### `PurePath.with_segments(*pathsegments)`701702Создаёт новый объект пути того же типа, объединяя указанные *pathsegments*. Этот метод вызывается при создании производного пути, например из [`parent`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.parent) и [`relative_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.relative_to). Подклассы могут переопределять этот метод для передачи информации производным путям, например:703704```python705from pathlib import PurePosixPath706707class MyPath(PurePosixPath):708    def __init__(self, *pathsegments, session_id):709        super().__init__(*pathsegments)710        self.session_id = session_id711712    def with_segments(self, *pathsegments):713        return type(self)(*pathsegments, session_id=self.session_id)714715etc = MyPath('/etc', session_id=42)716hosts = etc / 'hosts'717print(hosts.session_id)  # 42718```719720Добавлено в версии 3.12.721722## Конкретные пути723724Конкретные пути – это подклассы чистых классов путей. В дополнение к операциям, предоставляемым последними, они также предоставляют методы для выполнения системных вызовов над объектами путей. Есть три способа создания конкретных путей:725726#### `class pathlib.Path(*pathsegments)`727728Подкласс [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath); этот класс представляет конкретные пути, соответствующие flavour данной файловой системы (при создании экземпляра создаётся либо [`PosixPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PosixPath), либо [`WindowsPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.WindowsPath)):729730```python731>>> Path('setup.py')732PosixPath('setup.py')733```734735Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath).736737#### `class pathlib.PosixPath(*pathsegments)`738739Подкласс [`Path`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path) и [`PurePosixPath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePosixPath); этот класс представляет конкретные пути для файловых систем, отличных от Windows:740741```python742>>> PosixPath('/etc/hosts')743PosixPath('/etc/hosts')744```745746Параметр *pathsegments* задаётся так же, как [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath).747748#### `class pathlib.WindowsPath(*pathsegments)`749750Подкласс [`Path`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path) и [`PureWindowsPath`](https://python-all.ru/3.12/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.12/library/pathlib.html#pathlib.PurePath).758759Можно создать экземпляр только того flavour класса, который соответствует системе (использование системных вызовов для несовместимых flavour путей может привести к ошибкам или сбоям в приложении):760761```python762>>> import os763>>> os.name764'posix'765>>> Path('setup.py')766PosixPath('setup.py')767>>> PosixPath('setup.py')768PosixPath('setup.py')769>>> WindowsPath('setup.py')770Traceback (most recent call last):771  File "<stdin>", line 1, in <module>772  File "pathlib.py", line 798, in __new__773    % (cls.__name__,))774NotImplementedError: cannot instantiate 'WindowsPath' on your system775```776777Некоторые методы конкретных путей могут возбуждать [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError), если системный вызов завершается ошибкой (например, потому что путь не существует).778779### Расширение и разрешение путей780781#### `classmethod Path.home()`782783Возвращает новый объект пути, представляющий домашний каталог пользователя (как возвращается [`os.path.expanduser()`](https://python-all.ru/3.12/library/os.path.html#os.path.expanduser) с конструкцией `~`). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError).784785```python786>>> Path.home()787PosixPath('/home/antoine')788```789790Добавлено в версии 3.5.791792#### `Path.expanduser()`793794Возвращает новый путь с развёрнутыми конструкциями `~` и `~user`, как возвращается [`os.path.expanduser()`](https://python-all.ru/3.12/library/os.path.html#os.path.expanduser). Если домашний каталог не может быть определён, возбуждается [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError).795796```python797>>> p = PosixPath('~/films/Monty Python')798>>> p.expanduser()799PosixPath('/home/eric/films/Monty Python')800```801802Добавлено в версии 3.5.803804#### `classmethod Path.cwd()`805806Возвращает новый объект пути, представляющий текущий каталог (как возвращается [`os.getcwd()`](https://python-all.ru/3.12/library/os.html#os.getcwd)):807808```python809>>> Path.cwd()810PosixPath('/home/antoine/pathlib')811```812813#### `Path.absolute()`814815Делает путь абсолютным, без нормализации или разрешения симлинков. Возвращает новый объект path:816817```python818>>> p = Path('tests')819>>> p820PosixPath('tests')821>>> p.absolute()822PosixPath('/home/antoine/pathlib/tests')823```824825#### `Path.resolve(strict=False)`826827Делает путь абсолютным, разрешая все символические ссылки. Возвращается новый объект пути:828829```python830>>> p = Path()831>>> p832PosixPath('.')833>>> p.resolve()834PosixPath('/home/antoine/pathlib')835```836837`..`” компоненты также удаляются (это единственный метод, который это делает):838839```python840>>> p = Path('docs/../setup.py')841>>> p.resolve()842PosixPath('/home/antoine/pathlib/setup.py')843```844845Если путь не существует и *strict* равен `True`, возникает [`FileNotFoundError`](https://python-all.ru/3.12/library/exceptions.html#FileNotFoundError). Если *strict* равен `False`, путь разрешается настолько, насколько возможно, и остаток добавляется без проверки на существование. Если во время разрешения пути встречается бесконечный цикл, возникает [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError).846847Изменено в версии 3.6: Добавлен параметр *strict* (поведение до версии 3.6 – строгое).848849#### `Path.readlink()`850851Возвращает путь, на который указывает симлинк (как возвращается [`os.readlink()`](https://python-all.ru/3.12/library/os.html#os.readlink)):852853```python854>>> p = Path('mylink')855>>> p.symlink_to('setup.py')856>>> p.readlink()857PosixPath('setup.py')858```859860Добавлено в версии 3.9.861862### Запрос типа файла и статуса863864Изменено в версии 3.8: Методы [`exists()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.exists), [`is_dir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_dir), [`is_file()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_file), [`is_mount()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_mount), [`is_symlink()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_symlink), [`is_block_device()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_block_device), [`is_char_device()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_char_device), [`is_fifo()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_fifo), [`is_socket()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_socket) теперь возвращают `False` вместо возбуждения исключения для путей, содержащих символы, непредставимые на уровне ОС.865866#### `Path.stat(*, follow_symlinks=True)`867868Возвращает объект [`os.stat_result`](https://python-all.ru/3.12/library/os.html#os.stat_result), содержащий информацию об этом пути, как [`os.stat()`](https://python-all.ru/3.12/library/os.html#os.stat). Результат запрашивается при каждом вызове этого метода.869870Этот метод обычно следует по симлинкам; чтобы выполнить stat для самого симлинка, добавьте аргумент `follow_symlinks=False`, или используйте [`lstat()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.lstat).871872```python873>>> p = Path('setup.py')874>>> p.stat().st_size875956876>>> p.stat().st_mtime8771327883547.852554878```879880Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.881882#### `Path.lstat()`883884Как [`Path.stat()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.stat), но если путь указывает на симлинк, возвращает информацию о симлинке, а не о его цели.885886#### `Path.exists(*, follow_symlinks=True)`887888Возвращает `True`, если путь указывает на существующий файл или каталог.889890Этот метод обычно следует по симлинкам; чтобы проверить существование симлинка, добавьте аргумент `follow_symlinks=False`.891892```python893>>> Path('.').exists()894True895>>> Path('setup.py').exists()896True897>>> Path('/etc').exists()898True899>>> Path('nonexistentfile').exists()900False901```902903Изменено в версии 3.12: Добавлен параметр *follow\_symlinks*.904905#### `Path.is_file()`906907Возвращает `True`, если путь указывает на обычный файл (или символическую ссылку на обычный файл), и `False`, если указывает на файл другого типа.908909`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.910911#### `Path.is_dir()`912913Возвращает `True`, если путь указывает на каталог (или символическую ссылку на каталог), и `False`, если указывает на файл другого типа.914915`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.916917#### `Path.is_symlink()`918919Возвращает `True`, если путь указывает на символическую ссылку, иначе `False`.920921`False` также возвращается, если путь не существует; другие ошибки (например, ошибки прав доступа) передаются дальше.922923#### `Path.is_junction()`924925Возвращает `True`, если путь указывает на junction, и `False` для любого другого типа файла. В настоящее время только Windows поддерживает junctions.926927Добавлено в версии 3.12.928929#### `Path.is_mount()`930931Возвращает `True`, если путь является *точкой монтирования*: точка в файловой системе, куда смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог *path*, `path/..`, на другом устройстве, чем *path*, или указывают ли `path/..` и *path* на один и тот же i-node на одном и том же устройстве – это должно определять точки монтирования для всех вариантов Unix и POSIX. В Windows точкой монтирования считается корень диска (например, `c:\`), общая папка UNC (например, `\\server\share`) или смонтированная директория файловой системы.932933Добавлено в версии 3.7.934935Изменено в версии 3.12: Добавлена поддержка Windows.936937#### `Path.is_socket()`938939Возвращает `True`, если путь указывает на сокет Unix (или на символическую ссылку, указывающую на сокет Unix), `False` если он указывает на файл другого типа.940941`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.942943#### `Path.is_fifo()`944945Возвращает `True`, если путь указывает на FIFO (или на символическую ссылку, указывающую на FIFO), `False` если он указывает на файл другого типа.946947`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.948949#### `Path.is_block_device()`950951Возвращает `True`, если путь указывает на блочное устройство (или на символическую ссылку, указывающую на блочное устройство), `False` если он указывает на файл другого типа.952953`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.954955#### `Path.is_char_device()`956957Возвращает `True`, если путь указывает на символьное устройство (или на символическую ссылку, указывающую на символьное устройство), `False` если он указывает на файл другого типа.958959`False` также возвращается, если путь не существует или является битой символьной ссылкой; другие ошибки (например, ошибки прав доступа) передаются.960961#### `Path.samefile(other_path)`962963Возвращает, указывает ли этот путь на тот же файл, что и *other\_path*, который может быть как объектом Path, так и строкой. Семантика аналогична [`os.path.samefile()`](https://python-all.ru/3.12/library/os.path.html#os.path.samefile) и [`os.path.samestat()`](https://python-all.ru/3.12/library/os.path.html#os.path.samestat).964965Исключение [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError) может быть возбуждено, если какой-либо из файлов недоступен по какой-либо причине.966967```python968>>> p = Path('spam')969>>> q = Path('eggs')970>>> p.samefile(q)971False972>>> p.samefile('spam')973True974```975976Добавлено в версии 3.5.977978### Чтение и запись файлов979980#### `Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)`981982Открывает файл, на который указывает путь, как это делает встроенная функция [`open()`](https://python-all.ru/3.12/library/functions.html#open) :983984```python985>>> p = Path('setup.py')986>>> with p.open() as f:987...     f.readline()988...989'#!/usr/bin/env python3\n'990```991992#### `Path.read_text(encoding=None, errors=None)`993994Возвращает декодированное содержимое файла, на который указывает путь, в виде строки:995996```python997>>> p = Path('my_text_file')998>>> p.write_text('Text file contents')999181000>>> p.read_text()1001'Text file contents'1002```10031004Файл открывается, а затем закрывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.12/library/functions.html#open).10051006Добавлено в версии 3.5.10071008#### `Path.read_bytes()`10091010Возвращает двоичное содержимое файла, на который указывает путь, в виде объекта bytes:10111012```python1013>>> p = Path('my_binary_file')1014>>> p.write_bytes(b'Binary file contents')1015201016>>> p.read_bytes()1017b'Binary file contents'1018```10191020Добавлено в версии 3.5.10211022#### `Path.write_text(data, encoding=None, errors=None, newline=None)`10231024Открывает файл в текстовом режиме, записывает в него *data* и закрывает файл:10251026```python1027>>> p = Path('my_text_file')1028>>> p.write_text('Text file contents')1029181030>>> p.read_text()1031'Text file contents'1032```10331034Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют тот же смысл, что и в [`open()`](https://python-all.ru/3.12/library/functions.html#open).10351036Добавлено в версии 3.5.10371038Изменено в версии 3.10: Добавлен параметр *newline*.10391040#### `Path.write_bytes(data)`10411042Открывает файл в байтовом режиме, записывает в него *data* и закрывает файл:10431044```python1045>>> p = Path('my_binary_file')1046>>> p.write_bytes(b'Binary file contents')1047201048>>> p.read_bytes()1049b'Binary file contents'1050```10511052Существующий файл с таким же именем перезаписывается.10531054Добавлено в версии 3.5.10551056### Чтение каталогов10571058#### `Path.iterdir()`10591060Если путь указывает на каталог, возвращает объекты пути для его содержимого:10611062```python1063>>> p = Path('docs')1064>>> for child in p.iterdir(): child1065...1066PosixPath('docs/conf.py')1067PosixPath('docs/_templates')1068PosixPath('docs/make.bat')1069PosixPath('docs/index.rst')1070PosixPath('docs/_build')1071PosixPath('docs/_static')1072PosixPath('docs/Makefile')1073```10741075Дочерние элементы возвращаются в произвольном порядке, а специальные записи `'.'` и `'..'` не включаются. Если файл удаляется или добавляется в каталог после создания итератора, то не определено, будет ли включен объект пути для этого файла.10761077Если путь не является каталогом или недоступен по другой причине, вызывается [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError).10781079#### `Path.glob(pattern, *, case_sensitive=None)`10801081Выполняет поиск по заданному относительному *pattern* в каталоге, представленном этим путем, возвращая все совпадающие файлы (любого типа):10821083```python1084>>> sorted(Path('.').glob('*.py'))1085[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]1086>>> sorted(Path('.').glob('*/*.py'))1087[PosixPath('docs/conf.py')]1088```10891090Шаблоны такие же, как для [`fnmatch`](https://python-all.ru/3.12/library/fnmatch.html#module-fnmatch), с добавлением «`**`», что означает «этот каталог и все подкаталоги, рекурсивно». Иными словами, это включает рекурсивный поиск по шаблону:10911092```python1093>>> sorted(Path('.').glob('**/*.py'))1094[PosixPath('build/lib/pathlib.py'),1095 PosixPath('docs/conf.py'),1096 PosixPath('pathlib.py'),1097 PosixPath('setup.py'),1098 PosixPath('test_pathlib.py')]1099```11001101Этот метод вызывает [`Path.is_dir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_dir) для корневого каталога и распространяет любое возникшее исключение [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError). Последующие исключения [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError) при сканировании каталогов подавляются.11021103По умолчанию, или когда аргумент *case\_sensitive* (только по имени) установлен в `None`, этот метод сопоставляет пути с учетом правил регистра, специфичных для платформы: обычно с учетом регистра на POSIX и без учета регистра на Windows. Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.11041105> **Примечание**1106>1107> Использование шаблона «`**`» в больших деревьях каталогов может занять чрезмерно много времени.11081109Возбуждает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `pathlib.Path.glob` с аргументами `self`, `pattern`.11101111Изменено в версии 3.11: Возвращает только каталоги, если *pattern* заканчивается разделителем компонентов пути ([`sep`](https://python-all.ru/3.12/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.12/library/os.html#os.altsep)).11121113Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.11141115#### `Path.rglob(pattern, *, case_sensitive=None)`11161117Рекурсивно ищет по заданному относительному шаблону *pattern*. Это аналогично вызову [`Path.glob()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.glob) с добавлением «`**/`» перед *pattern*, где *patterns* такие же, как для [`fnmatch`](https://python-all.ru/3.12/library/fnmatch.html#module-fnmatch):11181119```python1120>>> sorted(Path().rglob("*.py"))1121[PosixPath('build/lib/pathlib.py'),1122 PosixPath('docs/conf.py'),1123 PosixPath('pathlib.py'),1124 PosixPath('setup.py'),1125 PosixPath('test_pathlib.py')]1126```11271128По умолчанию, или когда аргумент *case\_sensitive* (только по имени) установлен в `None`, этот метод сопоставляет пути с учетом правил регистра, специфичных для платформы: обычно с учетом регистра на POSIX и без учета регистра на Windows. Установите *case\_sensitive* в `True` или `False`, чтобы переопределить это поведение.11291130Возбуждает [событие аудита](https://python-all.ru/3.12/library/sys.html#auditing) `pathlib.Path.rglob` с аргументами `self`, `pattern`.11311132Изменено в версии 3.11: Возвращает только каталоги, если *pattern* заканчивается разделителем компонентов пути ([`sep`](https://python-all.ru/3.12/library/os.html#os.sep) или [`altsep`](https://python-all.ru/3.12/library/os.html#os.altsep)).11331134Изменено в версии 3.12: Добавлен параметр *case\_sensitive*.11351136#### `Path.walk(top_down=True, on_error=None, follow_symlinks=False)`11371138Генерирует имена файлов в дереве каталогов, обходя дерево сверху вниз или снизу вверх.11391140Для каждого каталога в дереве каталогов с корнем *self* (включая *self*, но исключая '.' и '..'), метод возвращает кортеж из 3 элементов: `(dirpath, dirnames, filenames)`.11411142*dirpath* – это [`Path`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path) к текущему обходимому каталогу, *dirnames* – список строк с именами подкаталогов в *dirpath* (исключая `'.'` и `'..'`), а *filenames* – список строк с именами файлов (не каталогов) в *dirpath*. Чтобы получить полный путь (начинающийся с *self*) к файлу или каталогу в *dirpath*, используйте `dirpath / name`. Отсортированы ли списки, зависит от файловой системы.11431144Если необязательный аргумент *top\_down* равен true (по умолчанию), тройка для каталога генерируется до троек для любых его подкаталогов (каталоги обходятся сверху вниз). Если *top\_down* равен false, тройка для каталога генерируется после троек для всех его подкаталогов (каталоги обходятся снизу вверх). Независимо от значения *top\_down*, список подкаталогов извлекается до того, как будут обойдены тройки для каталога и его подкаталогов.11451146Когда *top\_down* равен true, вызывающий код может изменить список *dirnames* на месте (например, с помощью [`del`](https://python-all.ru/3.12/reference/simple_stmts.html#del) или присваивания среза), и [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) будет рекурсивно обходить только те подкаталоги, чьи имена остались в *dirnames*. Это можно использовать для обрезки поиска, наложения определённого порядка обхода или даже для информирования [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) о каталогах, которые вызывающий код создаёт или переименовывает до того, как возобновит [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) снова. Изменение *dirnames*, когда *top\_down* равен false, не влияет на поведение [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk), поскольку каталоги в *dirnames* уже были сгенерированы к моменту, когда *dirnames* передаётся вызывающему коду.11471148По умолчанию ошибки [`os.scandir()`](https://python-all.ru/3.12/library/os.html#os.scandir) игнорируются. Если указан необязательный аргумент *on\_error*, это должен быть вызываемый объект; он будет вызван с одним аргументом – экземпляром [`OSError`](https://python-all.ru/3.12/library/exceptions.html#OSError). Этот вызываемый объект может обработать ошибку, чтобы продолжить обход, или повторно возбудить её, чтобы остановить обход. Обратите внимание: имя файла доступно как атрибут `filename` объекта исключения.11491150По умолчанию [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) не переходит по символическим ссылкам, а вместо этого добавляет их в список *filenames*. Установите *follow\_symlinks* в true, чтобы разрешать символические ссылки и помещать их в *dirnames* и *filenames* в соответствии с их целями, и, таким образом, обходить каталоги, на которые указывают символические ссылки (если это поддерживается).11511152> **Примечание**1153>1154> Имейте в виду, что установка *follow\_symlinks* в true может привести к бесконечной рекурсии, если ссылка указывает на родительский каталог самой себя. [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) не отслеживает уже посещённые каталоги.11551156> **Примечание**1157>1158> [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) предполагает, что обходимые им каталоги не изменяются во время выполнения. Например, если каталог из *dirnames* был заменён символической ссылкой, а *follow\_symlinks* равно false, [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) всё равно попытается спуститься в него. Чтобы предотвратить такое поведение, удаляйте каталоги из *dirnames* по мере необходимости.11591160> **Примечание**1161>1162> В отличие от [`os.walk()`](https://python-all.ru/3.12/library/os.html#os.walk), [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) перечисляет символические ссылки на каталоги в *filenames*, если *follow\_symlinks* равно false.11631164Этот пример показывает количество байтов, используемых всеми файлами в каждом каталоге, игнорируя каталоги `__pycache__`:11651166```python1167from pathlib import Path1168for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print):1169  print(1170      root,1171      "consumes",1172      sum((root / file).stat().st_size for file in files),1173      "bytes in",1174      len(files),1175      "non-directory files"1176  )1177  if '__pycache__' in dirs:1178        dirs.remove('__pycache__')1179```11801181Следующий пример – простая реализация [`shutil.rmtree()`](https://python-all.ru/3.12/library/shutil.html#shutil.rmtree). Обход дерева снизу вверх необходим, поскольку [`rmdir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.rmdir) не позволяет удалить каталог, пока он не пуст:11821183```python1184# Удалить всё, доступное из каталога "top".1185# ВНИМАНИЕ: Это опасно! Например, если top == Path('/'),1186# это может удалить все файлы.1187for root, dirs, files in top.walk(top_down=False):1188    for name in files:1189        (root / name).unlink()1190    for name in dirs:1191        (root / name).rmdir()1192```11931194Добавлено в версии 3.12.11951196### Создание файлов и каталогов11971198#### `Path.touch(mode=0o666, exist_ok=True)`11991200Создаёт файл по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если файл уже существует, функция завершается успешно, когда *exist\_ok* равен true (время модификации обновляется до текущего), в противном случае возбуждается [`FileExistsError`](https://python-all.ru/3.12/library/exceptions.html#FileExistsError).12011202> **См. также**1203>1204> Методы [`open()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.open), [`write_text()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.write_text) и [`write_bytes()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.write_bytes) часто используются для создания файлов.12051206#### `Path.mkdir(mode=0o777, parents=False, exist_ok=False)`12071208Создаёт новый каталог по указанному пути. Если задан *mode*, он комбинируется со значением `umask` процесса для определения режима файла и флагов доступа. Если путь уже существует, возбуждается [`FileExistsError`](https://python-all.ru/3.12/library/exceptions.html#FileExistsError).12091210Если *parents* равен true, любые отсутствующие родительские каталоги этого пути создаются по мере необходимости; они создаются с правами по умолчанию без учёта *mode* (имитируя команду POSIX `mkdir -p`).12111212Если *parents* равен false (по умолчанию), отсутствие родительского каталога вызывает [`FileNotFoundError`](https://python-all.ru/3.12/library/exceptions.html#FileNotFoundError).12131214Если *exist\_ok* равен false (по умолчанию), [`FileExistsError`](https://python-all.ru/3.12/library/exceptions.html#FileExistsError) возбуждается, если целевой каталог уже существует.12151216Если *exist\_ok* равен true, [`FileExistsError`](https://python-all.ru/3.12/library/exceptions.html#FileExistsError) не будет возбуждаться, за исключением случая, когда указанный путь уже существует в файловой системе и не является каталогом (аналогично поведению команды POSIX `mkdir -p`).12171218Изменено в версии 3.5: Добавлен параметр *exist\_ok*.12191220#### `Path.symlink_to(target, target_is_directory=False)`12211222Делает этот путь символической ссылкой, указывающей на *target*.12231224В Windows символическая ссылка представляет собой файл или каталог и не изменяется динамически в соответствии с целью. Если цель существует, тип ссылки будет создан соответствующим. В противном случае ссылка будет создана как каталог, если *target\_is\_directory* равен true, или как файловая ссылка (по умолчанию) в противном случае. На платформах, отличных от Windows, *target\_is\_directory* игнорируется.12251226```python1227>>> p = Path('mylink')1228>>> p.symlink_to('setup.py')1229>>> p.resolve()1230PosixPath('/home/antoine/pathlib/setup.py')1231>>> p.stat().st_size12329561233>>> p.lstat().st_size123481235```12361237> **Примечание**1238>1239> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.symlink()`](https://python-all.ru/3.12/library/os.html#os.symlink).12401241#### `Path.hardlink_to(target)`12421243Делает этот путь жёсткой ссылкой на тот же файл, что и *target*.12441245> **Примечание**1246>1247> Порядок аргументов (ссылка, цель) обратный по сравнению с [`os.link()`](https://python-all.ru/3.12/library/os.html#os.link).12481249Добавлено в версии 3.10.12501251### Переименование и удаление12521253#### `Path.rename(target)`12541255Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. В Unix, если *target* существует и является файлом, он будет молча заменён, если у пользователя есть разрешение. В Windows, если *target* существует, будет вызвано [`FileExistsError`](https://python-all.ru/3.12/library/exceptions.html#FileExistsError). *target* может быть строкой или другим объектом пути.12561257```python1258>>> p = Path('foo')1259>>> p.open('w').write('some text')126091261>>> target = Path('bar')1262>>> p.rename(target)1263PosixPath('bar')1264>>> target.open().read()1265'some text'1266```12671268Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.12691270Реализован через [`os.rename()`](https://python-all.ru/3.12/library/os.html#os.rename) и даёт те же гарантии.12711272Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.12731274#### `Path.replace(target)`12751276Переименовывает этот файл или каталог в указанный *target* и возвращает новый экземпляр `Path`, указывающий на *target*. Если *target* указывает на существующий файл или пустой каталог, он будет безусловно заменён.12771278Путь назначения может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, *а не* каталога объекта `Path`.12791280Изменено в версии 3.8: Добавлено возвращаемое значение – возвращается новый экземпляр `Path`.12811282#### `Path.unlink(missing_ok=False)`12831284Удаляет этот файл или символическую ссылку. Если путь указывает на каталог, используйте [`Path.rmdir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.rmdir).12851286Если *missing\_ok* равно false (по умолчанию), [`FileNotFoundError`](https://python-all.ru/3.12/library/exceptions.html#FileNotFoundError) вызывается, если путь не существует.12871288Если *missing\_ok* равно true, исключения [`FileNotFoundError`](https://python-all.ru/3.12/library/exceptions.html#FileNotFoundError) будут игнорироваться (аналогично поведению команды POSIX `rm -f`).12891290Изменено в версии 3.8: Добавлен параметр *missing\_ok*.12911292#### `Path.rmdir()`12931294Удаляет этот каталог. Каталог должен быть пустым.12951296### Права доступа и владение12971298#### `Path.owner()`12991300Возвращает имя пользователя-владельца файла. [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError) возбуждается, если идентификатор пользователя (UID) файла не найден в системной базе данных.13011302#### `Path.group()`13031304Возвращает имя группы-владельца файла. [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError) возбуждается, если идентификатор группы (GID) файла не найден в системной базе данных.13051306#### `Path.chmod(mode, *, follow_symlinks=True)`13071308Изменяет режим и права доступа к файлу, как [`os.chmod()`](https://python-all.ru/3.12/library/os.html#os.chmod).13091310Этот метод обычно переходит по символьным ссылкам. Некоторые варианты Unix поддерживают изменение прав доступа на самой символьной ссылке; на таких платформах можно добавить аргумент `follow_symlinks=False` или использовать [`lchmod()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.lchmod).13111312```python1313>>> p = Path('setup.py')1314>>> p.stat().st_mode1315332771316>>> p.chmod(0o444)1317>>> p.stat().st_mode1318330601319```13201321Изменено в версии 3.10: Добавлен параметр *follow\_symlinks*.13221323#### `Path.lchmod(mode)`13241325Как [`Path.chmod()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.chmod), но если путь указывает на символьную ссылку, то изменяется режим самой символьной ссылки, а не её цели.13261327## Соответствие инструментам в модуле [`os`](https://python-all.ru/3.12/library/os.html#module-os)13281329Ниже представлена таблица, сопоставляющая различные функции [`os`](https://python-all.ru/3.12/library/os.html#module-os) с их эквивалентами в [`PurePath`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath)/[`Path`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path).13301331| [`os`](https://python-all.ru/3.12/library/os.html#module-os) и [`os.path`](https://python-all.ru/3.12/library/os.path.html#module-os.path) | [`pathlib`](https://python-all.ru/3.12/library/pathlib.html#module-pathlib) |1332| --- | --- |1333| [`os.path.dirname()`](https://python-all.ru/3.12/library/os.path.html#os.path.dirname) | [`PurePath.parent`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.parent) |1334| [`os.path.basename()`](https://python-all.ru/3.12/library/os.path.html#os.path.basename) | [`PurePath.name`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.name) |1335| [`os.path.splitext()`](https://python-all.ru/3.12/library/os.path.html#os.path.splitext) | [`PurePath.stem`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.stem), [`PurePath.suffix`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.suffix) |1336| [`os.path.join()`](https://python-all.ru/3.12/library/os.path.html#os.path.join) | [`PurePath.joinpath()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.joinpath) |1337| [`os.path.isabs()`](https://python-all.ru/3.12/library/os.path.html#os.path.isabs) | [`PurePath.is_absolute()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.is_absolute) |1338| [`os.path.relpath()`](https://python-all.ru/3.12/library/os.path.html#os.path.relpath) | [`PurePath.relative_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.relative_to) [\[1\]](https://python-all.ru/3.12/library/pathlib.html#id7) |1339| [`os.path.expanduser()`](https://python-all.ru/3.12/library/os.path.html#os.path.expanduser) | [`Path.expanduser()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.expanduser) [\[2\]](https://python-all.ru/3.12/library/pathlib.html#id8) |1340| [`os.path.realpath()`](https://python-all.ru/3.12/library/os.path.html#os.path.realpath) | [`Path.resolve()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.resolve) |1341| [`os.path.abspath()`](https://python-all.ru/3.12/library/os.path.html#os.path.abspath) | [`Path.absolute()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.absolute) [\[3\]](https://python-all.ru/3.12/library/pathlib.html#id9) |1342| [`os.path.exists()`](https://python-all.ru/3.12/library/os.path.html#os.path.exists) | [`Path.exists()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.exists) |1343| [`os.path.isfile()`](https://python-all.ru/3.12/library/os.path.html#os.path.isfile) | [`Path.is_file()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_file) |1344| [`os.path.isdir()`](https://python-all.ru/3.12/library/os.path.html#os.path.isdir) | [`Path.is_dir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_dir) |1345| [`os.path.islink()`](https://python-all.ru/3.12/library/os.path.html#os.path.islink) | [`Path.is_symlink()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_symlink) |1346| [`os.path.isjunction()`](https://python-all.ru/3.12/library/os.path.html#os.path.isjunction) | [`Path.is_junction()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_junction) |1347| [`os.path.ismount()`](https://python-all.ru/3.12/library/os.path.html#os.path.ismount) | [`Path.is_mount()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.is_mount) |1348| [`os.path.samefile()`](https://python-all.ru/3.12/library/os.path.html#os.path.samefile) | [`Path.samefile()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.samefile) |1349| [`os.getcwd()`](https://python-all.ru/3.12/library/os.html#os.getcwd) | [`Path.cwd()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.cwd) |1350| [`os.stat()`](https://python-all.ru/3.12/library/os.html#os.stat) | [`Path.stat()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.stat) |1351| [`os.lstat()`](https://python-all.ru/3.12/library/os.html#os.lstat) | [`Path.lstat()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.lstat) |1352| [`os.listdir()`](https://python-all.ru/3.12/library/os.html#os.listdir) | [`Path.iterdir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.iterdir) |1353| [`os.walk()`](https://python-all.ru/3.12/library/os.html#os.walk) | [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) [\[4\]](https://python-all.ru/3.12/library/pathlib.html#id10) |1354| [`os.mkdir()`](https://python-all.ru/3.12/library/os.html#os.mkdir), [`os.makedirs()`](https://python-all.ru/3.12/library/os.html#os.makedirs) | [`Path.mkdir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.mkdir) |1355| [`os.link()`](https://python-all.ru/3.12/library/os.html#os.link) | [`Path.hardlink_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.hardlink_to) |1356| [`os.symlink()`](https://python-all.ru/3.12/library/os.html#os.symlink) | [`Path.symlink_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.symlink_to) |1357| [`os.readlink()`](https://python-all.ru/3.12/library/os.html#os.readlink) | [`Path.readlink()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.readlink) |1358| [`os.rename()`](https://python-all.ru/3.12/library/os.html#os.rename) | [`Path.rename()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.rename) |1359| [`os.replace()`](https://python-all.ru/3.12/library/os.html#os.replace) | [`Path.replace()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.replace) |1360| [`os.remove()`](https://python-all.ru/3.12/library/os.html#os.remove), [`os.unlink()`](https://python-all.ru/3.12/library/os.html#os.unlink) | [`Path.unlink()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.unlink) |1361| [`os.rmdir()`](https://python-all.ru/3.12/library/os.html#os.rmdir) | [`Path.rmdir()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.rmdir) |1362| [`os.chmod()`](https://python-all.ru/3.12/library/os.html#os.chmod) | [`Path.chmod()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.chmod) |1363| [`os.lchmod()`](https://python-all.ru/3.12/library/os.html#os.lchmod) | [`Path.lchmod()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.lchmod) |13641365Сноски13661367\[[1](https://python-all.ru/3.12/library/pathlib.html#id3)\]13681369[`os.path.relpath()`](https://python-all.ru/3.12/library/os.path.html#os.path.relpath) вызывает [`abspath()`](https://python-all.ru/3.12/library/os.path.html#os.path.abspath), чтобы сделать пути абсолютными и удалить части «`..`», тогда как [`PurePath.relative_to()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.PurePath.relative_to) является лексической операцией, которая возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), когда якоря входных путей различаются (например, если один путь абсолютный, а другой относительный).13701371\[[2](https://python-all.ru/3.12/library/pathlib.html#id4)\]13721373[`os.path.expanduser()`](https://python-all.ru/3.12/library/os.path.html#os.path.expanduser) возвращает путь без изменений, если домашний каталог не может быть определён, тогда как [`Path.expanduser()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.expanduser) возбуждает [`RuntimeError`](https://python-all.ru/3.12/library/exceptions.html#RuntimeError).13741375\[[3](https://python-all.ru/3.12/library/pathlib.html#id5)\]13761377[`os.path.abspath()`](https://python-all.ru/3.12/library/os.path.html#os.path.abspath) удаляет компоненты «`..`» без разрешения символических ссылок, что может изменить значение пути, тогда как [`Path.absolute()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.absolute) оставляет любые компоненты «`..`» в пути.13781379\[[4](https://python-all.ru/3.12/library/pathlib.html#id6)\]13801381[`os.walk()`](https://python-all.ru/3.12/library/os.html#os.walk) всегда следует символьным ссылкам при разбиении путей на *имена каталогов* и *имена файлов*, тогда как [`Path.walk()`](https://python-all.ru/3.12/library/pathlib.html#pathlib.Path.walk) классифицирует все символьные ссылки как *имена файлов*, когда *follow\_symlinks* равен false (по умолчанию).1382