pathlib — объектно-ориентированные пути файловой системы
Добавлено в версии 3.4.
Исходный код: Lib/pathlib/
Этот модуль предоставляет классы, представляющие пути файловой системы с семантикой, подходящей для разных операционных систем. Классы путей делятся на чистые пути, предоставляющие только вычислительные операции без ввода-вывода, и конкретные пути, которые наследуются от чистых путей, но также предоставляют операции ввода-вывода.
Если вы никогда раньше не использовали этот модуль или просто не уверены, какой класс подходит для вашей задачи, скорее всего, вам нужен Path. Он создаёт экземпляр конкретного пути для платформы, на которой выполняется код.
Чистые пути полезны в некоторых особых случаях, например:
- Если вы хотите работать с путями Windows на Unix-машине (или наоборот). При работе в Unix нельзя создать экземпляр
WindowsPath, но можно создать экземплярPureWindowsPath. - Если вы хотите убедиться, что код работает с путями, не обращаясь непосредственно к ОС. В этом случае может быть полезно создать экземпляр одного из чистых классов, поскольку в них просто нет операций, обращающихся к ОС.
См. также
PEP 428: Модуль pathlib — объектно-ориентированные пути файловой системы.
См. также
Для низкоуровневой обработки путей в виде строк можно также использовать модуль os.path.
Основы использования
Импорт основного класса:
>>> from pathlib import Path
Просмотр подкаталогов:
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
PosixPath('__pycache__'), PosixPath('build')]
Просмотр файлов с исходным кодом Python в этом дереве каталогов:
>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
PosixPath('build/lib/pathlib.py')]
Перемещение по дереву каталогов:
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
Получение сведений о свойствах пути:
>>> q.exists() True >>> q.is_dir() False
Открытие файла:
>>> with q.open() as f: f.readline() ... '#!/bin/bash\n'
Исключения
-
exception pathlib.UnsupportedOperation -
Исключение, наследующее
NotImplementedError, которое возникает при вызове неподдерживаемой операции для объекта пути.Добавлено в версии 3.13.
Чистые пути
Объекты чистых путей предоставляют операции обработки путей, которые фактически не обращаются к файловой системе. Доступ к этим классам можно получить тремя способами; их также называют типами путей:
-
class pathlib.PurePath(*pathsegments) -
Общий класс, представляющий тип путей текущей системы (создание его экземпляра приводит к созданию объекта
PurePosixPathилиPureWindowsPath):>>> PurePath('setup.py') # Running on a Unix machine PurePosixPath('setup.py')Каждый элемент pathsegments может быть строкой, представляющей сегмент пути, или объектом, реализующим интерфейс
os.PathLike, у которого метод__fspath__()возвращает строку, например другим объектом пути:>>> PurePath('foo', 'some/path', 'bar') PurePosixPath('foo/some/path/bar') >>> PurePath(Path('foo'), Path('bar')) PurePosixPath('foo/bar')Если pathsegments пуст, предполагается текущий каталог:
>>> PurePath() PurePosixPath('.')Если сегмент является абсолютным путём, все предыдущие сегменты игнорируются (как в
os.path.join()):>>> PurePath('/etc', '/usr', 'lib64') PurePosixPath('/usr/lib64') >>> PureWindowsPath('c:/Windows', 'd:bar') PureWindowsPath('d:bar')В Windows диск не сбрасывается при встрече сегмента относительного пути с корнем (например,
r'\foo'):>>> PureWindowsPath('c:/Windows', '/Program Files') PureWindowsPath('c:/Program Files')Лишние косые черты и одиночные точки схлопываются, но двойные точки (
'..') и начальные двойные косые черты ('//') сохраняются, поскольку их удаление по разным причинам изменило бы смысл пути (например, из-за символических ссылок или путей UNC):>>> PurePath('foo//bar') PurePosixPath('foo/bar') >>> PurePath('//foo/bar') PurePosixPath('//foo/bar') >>> PurePath('foo/./bar') PurePosixPath('foo/bar') >>> PurePath('foo/../bar') PurePosixPath('foo/../bar')(наивный подход сделал бы
PurePosixPath('foo/../bar')эквивалентнымPurePosixPath('bar'), что неверно, еслиfooявляется символической ссылкой на другой каталог)Объекты чистых путей реализуют интерфейс
os.PathLike, поэтому их можно использовать везде, где принимаются объекты этого интерфейса.Изменено в версии 3.6: Добавлена поддержка интерфейса
os.PathLike.
-
class pathlib.PurePosixPath(*pathsegments) -
Подкласс
PurePath; этот тип путей представляет пути файловой системы, отличные от путей Windows:>>> PurePosixPath('/etc/hosts') PurePosixPath('/etc/hosts')Аргумент pathsegments указывается так же, как для
PurePath.
-
class pathlib.PureWindowsPath(*pathsegments) -
Подкласс
PurePath; этот тип путей представляет пути файловой системы Windows, включая пути UNC:>>> PureWindowsPath('c:/', 'Users', 'Ximénez') PureWindowsPath('c:/Users/Ximénez') >>> PureWindowsPath('//server/share/file') PureWindowsPath('//server/share/file')Аргумент pathsegments указывается так же, как для
PurePath.
Все эти классы можно создавать независимо от используемой системы, поскольку они не предоставляют операций, выполняющих системные вызовы.
Общие свойства
Пути неизменяемы и хешируемы. Пути одного типа можно сравнивать и упорядочивать. Эти свойства учитывают правила приведения регистра, характерные для данного типа путей:
>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True
Пути разных типов не равны и не могут быть упорядочены:
>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
Операторы
Оператор косой черты помогает создавать дочерние пути, как и os.path.join(). Если аргумент является абсолютным путём, предыдущий путь игнорируется. В Windows диск не сбрасывается, если аргумент является относительным путём с корнем (например, r'\foo'):
>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> p / '/an_absolute_path'
PurePosixPath('/an_absolute_path')
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
Объект пути можно использовать везде, где принимается объект, реализующий os.PathLike:
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
Строковое представление пути — это сам необработанный путь файловой системы (в нативном формате, например с обратными косыми чертами в Windows); его можно передавать любой функции, принимающей путь к файлу в виде строки:
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
Аналогично, вызов bytes для пути возвращает необработанный путь файловой системы в виде объекта bytes, закодированный с помощью os.fsencode():
>>> bytes(p) b'/etc'
Примечание
Вызов bytes рекомендуется использовать только в Unix. В Windows каноническим представлением путей файловой системы является форма Unicode.
Доступ к отдельным частям
Чтобы получить доступ к отдельным «частям» (компонентам) пути, используйте следующее свойство:
-
PurePath.parts -
Кортеж, предоставляющий доступ к различным компонентам пути:
>>> p = PurePath('/usr/bin/python3') >>> p.parts ('/', 'usr', 'bin', 'python3') >>> p = PureWindowsPath('c:/Program Files/PSF') >>> p.parts ('c:\\', 'Program Files', 'PSF')(обратите внимание, что диск и локальный корень объединены в одну часть)
Методы и свойства
Чистые пути предоставляют следующие методы и свойства:
-
PurePath.parser -
Реализация модуля
os.path, используемая для низкоуровневого разбора и объединения путей:posixpathилиntpath.Добавлено в версии 3.13.
-
PurePath.drive -
Строка, представляющая букву или имя диска, если они есть:
>>> PureWindowsPath('c:/Program Files/').drive 'c:' >>> PureWindowsPath('/Program Files/').drive '' >>> PurePosixPath('/etc').drive ''Общие ресурсы UNC также считаются дисками:
>>> PureWindowsPath('//host/share/foo.txt').drive '\\\\host\\share'
-
PurePath.root -
Строка, представляющая локальный или глобальный корень, если он есть:
>>> PureWindowsPath('c:/Program Files/').root '\\' >>> PureWindowsPath('c:Program Files/').root '' >>> PurePosixPath('/etc').root '/'У общих ресурсов UNC всегда есть корень:
>>> PureWindowsPath('//host/share').root '\\'Если путь начинается более чем с двух последовательных косых черт,
PurePosixPathсхлопывает их:>>> PurePosixPath('//etc').root '//' >>> PurePosixPath('///etc').root '/' >>> PurePosixPath('////etc').root '/'Примечание
Такое поведение соответствует документу Основные спецификации The Open Group, выпуск 6, пункту 4.11 Разрешение имён путей:
«Путь, начинающийся с двух последовательных косых черт, может интерпретироваться способом, определяемым реализацией, однако более двух начальных косых черт должны рассматриваться как одна косая черта».
-
PurePath.anchor -
Объединение диска и корня:
>>> PureWindowsPath('c:/Program Files/').anchor 'c:\\' >>> PureWindowsPath('c:Program Files/').anchor 'c:' >>> PurePosixPath('/etc').anchor '/' >>> PureWindowsPath('//host/share').anchor '\\\\host\\share\\'
-
PurePath.parents -
Неизменяемая последовательность, предоставляющая доступ к логическим родительским каталогам пути:
>>> p = PureWindowsPath('c:/foo/bar/setup.py') >>> p.parents[0] PureWindowsPath('c:/foo/bar') >>> p.parents[1] PureWindowsPath('c:/foo') >>> p.parents[2] PureWindowsPath('c:/')Изменено в версии 3.10: Последовательность parents теперь поддерживает срезы и отрицательные значения индексов.
-
PurePath.parent -
Логический родительский каталог пути:
>>> p = PurePosixPath('/a/b/c/d') >>> p.parent PurePosixPath('/a/b/c')Нельзя перейти выше якоря или пустого пути:
>>> p = PurePosixPath('/') >>> p.parent PurePosixPath('/') >>> p = PurePosixPath('.') >>> p.parent PurePosixPath('.')Примечание
Это чисто лексическая операция, поэтому она ведёт себя следующим образом:
>>> p = PurePosixPath('foo/..') >>> p.parent PurePosixPath('foo')Если нужно перемещаться вверх по произвольному пути файловой системы, рекомендуется сначала вызвать
Path.resolve(), чтобы разрешить символические ссылки и устранить компоненты"..".
-
PurePath.name -
Строка, представляющая последний компонент пути без диска и корня, если они есть:
>>> PurePosixPath('my/library/setup.py').name 'setup.py'Имена дисков UNC не учитываются:
>>> PureWindowsPath('//some/share/setup.py').name 'setup.py' >>> PureWindowsPath('//some/share').name ''
-
PurePath.suffix -
Последняя часть последнего компонента после точки, если она есть:
>>> PurePosixPath('my/library/setup.py').suffix '.py' >>> PurePosixPath('my/library.tar.gz').suffix '.gz' >>> PurePosixPath('my/library').suffix ''Обычно это называют расширением файла.
Изменено в версии 3.14: Одиночная точка (”
.”) считается допустимым суффиксом.
-
PurePath.suffixes -
Список суффиксов пути, часто называемых расширениями файлов:
>>> PurePosixPath('my/library.tar.gar').suffixes ['.tar', '.gar'] >>> PurePosixPath('my/library.tar.gz').suffixes ['.tar', '.gz'] >>> PurePosixPath('my/library').suffixes []Изменено в версии 3.14: Одиночная точка (”
.”) считается допустимым суффиксом.
-
PurePath.stem -
Последний компонент пути без суффикса:
>>> PurePosixPath('my/library.tar.gz').stem 'library.tar' >>> PurePosixPath('my/library.tar').stem 'library' >>> PurePosixPath('my/library').stem 'library'Изменено в версии 3.14: Одиночная точка (”
.”) считается допустимым суффиксом.
-
PurePath.as_posix() -
Возвращает строковое представление пути с прямыми косыми чертами (
/):>>> p = PureWindowsPath('c:\\windows') >>> str(p) 'c:\\windows' >>> p.as_posix() 'c:/windows'
-
PurePath.is_absolute() -
Возвращает, является ли путь абсолютным. Путь считается абсолютным, если у него есть корень и (если это допускается данным типом путей) диск:
>>> PurePosixPath('/a/b').is_absolute() True >>> PurePosixPath('a/b').is_absolute() False >>> PureWindowsPath('c:/a/b').is_absolute() True >>> PureWindowsPath('/a/b').is_absolute() False >>> PureWindowsPath('c:').is_absolute() False >>> PureWindowsPath('//some/share').is_absolute() True
-
PurePath.is_relative_to(other) -
Возвращает, является ли этот путь относительным к пути other.
>>> p = PurePath('/etc/passwd') >>> p.is_relative_to('/etc') True >>> p.is_relative_to('/usr') FalseЭтот метод работает со строками: он не обращается к файловой системе и не обрабатывает особым образом сегменты «
..». Следующий код эквивалентен:>>> u = PurePath('/usr') >>> u == p or u in p.parents FalseДобавлено в версии 3.9.
Устарело с версии 3.12, удалено в версии 3.14: Передача дополнительных аргументов объявлена устаревшей; если они указаны, то объединяются с other.
-
PurePath.is_reserved() -
Для
PureWindowsPathвозвращаетTrue, если путь считается зарезервированным в Windows, иFalseв противном случае. ДляPurePosixPathвсегда возвращаетсяFalse.Изменено в версии 3.13: Имена путей Windows, содержащие двоеточие или заканчивающиеся точкой либо пробелом, считаются зарезервированными. Пути UNC могут быть зарезервированы.
Устарело с версии 3.13, будет удалено в версии 3.15: Этот метод устарел; для обнаружения зарезервированных путей в Windows используйте
os.path.isreserved().
-
PurePath.joinpath(*pathsegments) -
Вызов этого метода эквивалентен последовательному объединению пути с каждым из переданных pathsegments:
>>> PurePosixPath('/etc').joinpath('passwd') PurePosixPath('/etc/passwd') >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd')) PurePosixPath('/etc/passwd') >>> PurePosixPath('/etc').joinpath('init.d', 'apache2') PurePosixPath('/etc/init.d/apache2') >>> PureWindowsPath('c:').joinpath('/Program Files') PureWindowsPath('c:/Program Files')
-
PurePath.full_match(pattern, *, case_sensitive=None) -
Сопоставляет этот путь с указанным шаблоном в стиле glob. Если сопоставление успешно, возвращает
True, в противном случае —False. Например:>>> PurePath('a/b.py').full_match('a/*.py') True >>> PurePath('a/b.py').full_match('*.py') False >>> PurePath('/a/b/c.py').full_match('/a/**') True >>> PurePath('/a/b/c.py').full_match('**/*.py') TrueСм. также
Документацию по языку шаблонов.
Как и в других методах, чувствительность к регистру определяется настройками платформы по умолчанию:
>>> PurePosixPath('b.py').full_match('*.PY') False >>> PureWindowsPath('b.py').full_match('*.PY') TrueУстановите case_sensitive в
TrueилиFalse, чтобы переопределить это поведение.Добавлено в версии 3.13.
-
PurePath.match(pattern, *, case_sensitive=None) -
Сопоставляет этот путь с указанным нерекурсивным шаблоном в стиле glob. Если сопоставление успешно, возвращает
True, в противном случае —False.Этот метод похож на
full_match(), но пустые шаблоны не допускаются (возникаетValueError), рекурсивный шаблон «**» не поддерживается (он работает как нерекурсивный «*»), а при указании относительного шаблона сопоставление выполняется справа:>>> PurePath('a/b.py').match('*.py') True >>> PurePath('/a/b/c.py').match('b/*.py') True >>> PurePath('/a/b/c.py').match('a/*.py') FalseИзменено в версии 3.12: Параметр pattern принимает объект, подобный пути.
Изменено в версии 3.12: Добавлен параметр case_sensitive.
-
PurePath.relative_to(other, walk_up=False) -
Вычисляет представление этого пути относительно пути, заданного аргументом other. Если это невозможно, возникает
ValueError:>>> p = PurePosixPath('/etc/passwd') >>> p.relative_to('/') PurePosixPath('etc/passwd') >>> p.relative_to('/etc') PurePosixPath('passwd') >>> p.relative_to('/usr') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pathlib.py", line 941, in relative_to raise ValueError(error_message.format(str(self), str(formatted))) ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.Если walk_up имеет значение false (по умолчанию), путь должен начинаться с other. Если аргумент имеет значение true, для создания относительного пути могут добавляться элементы
... Во всех остальных случаях, например если пути относятся к разным дискам, возникаетValueError:>>> p.relative_to('/usr', walk_up=True) PurePosixPath('../etc/passwd') >>> p.relative_to('foo', walk_up=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pathlib.py", line 941, in relative_to raise ValueError(error_message.format(str(self), str(formatted))) ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.Предупреждение
Эта функция относится к
PurePathи работает со строками. Она не проверяет и не использует базовую структуру файлов. Это может повлиять на работу параметра walk_up, поскольку предполагается, что в пути нет символических ссылок; при необходимости сначала вызовитеresolve(), чтобы разрешить символические ссылки.Изменено в версии 3.12: Добавлен параметр walk_up (предыдущее поведение соответствует
walk_up=False).Устарело с версии 3.12, удалено в версии 3.14: Передача дополнительных позиционных аргументов объявлена устаревшей; если они указаны, то объединяются с other.
-
PurePath.with_name(name) -
Возвращает новый путь с изменённым
name. Если у исходного пути нет имени, возникает ValueError:>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_name('setup.py') PureWindowsPath('c:/Downloads/setup.py') >>> p = PureWindowsPath('c:/') >>> p.with_name('setup.py') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name raise ValueError("%r has an empty name" % (self,)) ValueError: PureWindowsPath('c:/') has an empty name
-
PurePath.with_stem(stem) -
Возвращает новый путь с изменённой
stem. Если у исходного пути нет имени, возникает ValueError:>>> p = PureWindowsPath('c:/Downloads/draft.txt') >>> p.with_stem('final') PureWindowsPath('c:/Downloads/final.txt') >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_stem('lib') PureWindowsPath('c:/Downloads/lib.gz') >>> p = PureWindowsPath('c:/') >>> p.with_stem('') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem return self.with_name(stem + self.suffix) File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name raise ValueError("%r has an empty name" % (self,)) ValueError: PureWindowsPath('c:/') has an empty nameДобавлено в версии 3.9.
-
PurePath.with_suffix(suffix) -
Возвращает новый путь с изменённым
suffix. Если у исходного пути нет суффикса, новый suffix добавляется. Если suffix — пустая строка, исходный суффикс удаляется:>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_suffix('.bz2') PureWindowsPath('c:/Downloads/pathlib.tar.bz2') >>> p = PureWindowsPath('README') >>> p.with_suffix('.txt') PureWindowsPath('README.txt') >>> p = PureWindowsPath('README.txt') >>> p.with_suffix('') PureWindowsPath('README')Изменено в версии 3.14: Одиночная точка (”
.”) считается допустимым суффиксом. В предыдущих версиях при передаче одиночной точки возникалоValueError.
-
PurePath.with_segments(*pathsegments) -
Создаёт новый объект пути того же типа, объединяя указанные pathsegments. Этот метод вызывается при создании производного пути, например из
parentиrelative_to(). Подклассы могут переопределить этот метод, чтобы передавать сведения производным путям, например:from pathlib import PurePosixPath class MyPath(PurePosixPath): def __init__(self, *pathsegments, session_id): super().__init__(*pathsegments) self.session_id = session_id def with_segments(self, *pathsegments): return type(self)(*pathsegments, session_id=self.session_id) etc = MyPath('/etc', session_id=42) hosts = etc / 'hosts' print(hosts.session_id) # 42Добавлено в версии 3.12.
Конкретные пути
Конкретные пути являются подклассами классов чистых путей. Помимо операций, предоставляемых последними, они также предоставляют методы для выполнения системных вызовов над объектами путей. Существует три способа создания экземпляров конкретных путей:
-
class pathlib.Path(*pathsegments) -
Подкласс
PurePath, этот класс представляет конкретные пути для типа путей текущей системы (создание его экземпляра приводит к созданию либоPosixPath, либоWindowsPath):>>> Path('setup.py') PosixPath('setup.py')pathsegments указывается аналогично
PurePath.
-
class pathlib.PosixPath(*pathsegments) -
Подкласс
PathиPurePosixPath, этот класс представляет конкретные пути файловой системы, не относящиеся к Windows:>>> PosixPath('/etc/hosts') PosixPath('/etc/hosts')pathsegments указывается аналогично
PurePath.Изменено в версии 3.13: В Windows вызывает
UnsupportedOperation. В предыдущих версиях вместо этого вызывалось исключениеNotImplementedError.
-
class pathlib.WindowsPath(*pathsegments) -
Подкласс
PathиPureWindowsPath, этот класс представляет конкретные пути файловой системы Windows:>>> WindowsPath('c:/', 'Users', 'Ximénez') WindowsPath('c:/Users/Ximénez')pathsegments указывается аналогично
PurePath.Изменено в версии 3.13: На платформах, отличных от Windows, вызывает
UnsupportedOperation. В предыдущих версиях вместо этого вызывалось исключениеNotImplementedError.
Можно создавать экземпляр только того типа класса, который соответствует вашей системе (системные вызовы для несовместимых типов путей могут привести к ошибкам или сбоям в приложении):
>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 798, in __new__
% (cls.__name__,))
UnsupportedOperation: cannot instantiate 'WindowsPath' on your system
Некоторые методы конкретных путей могут вызывать OSError, если системный вызов завершается неудачно (например, потому что путь не существует).
Разбор и создание URI
Объекты конкретных путей можно создавать из URI «file» и представлять в виде URI «file», соответствующих RFC 8089.
Примечание
URI файлов не переносимы между компьютерами с разными кодировками файловой системы.
-
classmethod Path.from_uri(uri) -
Возвращает новый объект пути, созданный разбором URI «file». Например:
>>> p = Path.from_uri('file:///etc/hosts') PosixPath('/etc/hosts')В Windows из URI можно разбирать пути устройств DOS и UNC:
>>> p = Path.from_uri('file:///c:/windows') WindowsPath('c:/windows') >>> p = Path.from_uri('file://server/share') WindowsPath('//server/share')Поддерживаются несколько вариантов записи:
>>> p = Path.from_uri('file:////server/share') WindowsPath('//server/share') >>> p = Path.from_uri('file://///server/share') WindowsPath('//server/share') >>> p = Path.from_uri('file:c:/windows') WindowsPath('c:/windows') >>> p = Path.from_uri('file:/c|/windows') WindowsPath('c:/windows')Вызывается
ValueError, если URI не начинается сfile:или разобранный путь не является абсолютным.Добавлено в версии 3.13.
Изменено в версии 3.14: Поле authority URL отбрасывается, если оно совпадает с именем локального узла. В противном случае, если поле authority не пусто и не равно
localhost, в Windows возвращается путь UNC (как и раньше), а на других платформах вызываетсяValueError.
-
Path.as_uri() -
Представляет путь в виде URI «file». Вызывается
ValueError, если путь не является абсолютным.>>> p = PosixPath('/etc/passwd') >>> p.as_uri() 'file:///etc/passwd' >>> p = WindowsPath('c:/Windows') >>> p.as_uri() 'file:///c:/Windows'Устарело с версии 3.14, будет удалено в версии 3.19: Вызов этого метода у
PurePath, а не уPath, возможен, но считается устаревшим. Использование методомos.fsencode()делает его строго нечистым.
Подстановка и разрешение путей
-
classmethod Path.home() -
Возвращает новый объект пути, представляющий домашний каталог пользователя (возвращаемый
os.path.expanduser()с конструкцией~). Если домашний каталог невозможно определить, вызываетсяRuntimeError.>>> Path.home() PosixPath('/home/antoine')Добавлено в версии 3.5.
-
Path.expanduser() -
Возвращает новый путь с подставленными конструкциями
~и~user, как это делаетos.path.expanduser(). Если домашний каталог невозможно определить, вызываетсяRuntimeError.>>> p = PosixPath('~/films/Monty Python') >>> p.expanduser() PosixPath('/home/eric/films/Monty Python')Добавлено в версии 3.5.
-
classmethod Path.cwd() -
Возвращает новый объект пути, представляющий текущий каталог (возвращаемый
os.getcwd()):>>> Path.cwd() PosixPath('/home/antoine/pathlib')
-
Path.absolute() -
Преобразует путь в абсолютный без нормализации и разрешения символических ссылок. Возвращает новый объект пути:
>>> p = Path('tests') >>> p PosixPath('tests') >>> p.absolute() PosixPath('/home/antoine/pathlib/tests')
-
Path.resolve(strict=False) -
Преобразует путь в абсолютный, разрешая все символические ссылки. Возвращается новый объект пути:
>>> p = Path() >>> p PosixPath('.') >>> p.resolve() PosixPath('/home/antoine/pathlib')Компоненты «
..» также удаляются (это единственный метод, который это делает):>>> p = Path('docs/../setup.py') >>> p.resolve() PosixPath('/home/antoine/pathlib/setup.py')Если путь не существует или обнаружен цикл символических ссылок, а параметр strict равен
True, вызываетсяOSError. Если параметр strict равенFalse, путь разрешается настолько, насколько это возможно, а оставшаяся часть добавляется без проверки её существования.Изменено в версии 3.6: Добавлен параметр strict (поведение до версии 3.6 было строгим).
Изменено в версии 3.13: Циклы символических ссылок обрабатываются так же, как другие ошибки: в строгом режиме вызывается
OSError, а в нестрогом режиме исключение не вызывается. В предыдущих версияхRuntimeErrorвызывалось независимо от значения strict.
-
Path.readlink() -
Возвращает путь, на который указывает символическая ссылка (возвращаемый
os.readlink()):>>> p = Path('mylink') >>> p.symlink_to('setup.py') >>> p.readlink() PosixPath('setup.py')Добавлено в версии 3.9.
Изменено в версии 3.13: Вызывает
UnsupportedOperation, еслиos.readlink()недоступна. В предыдущих версиях вызывалось исключениеNotImplementedError.
Проверка типа и состояния файла
Изменено в версии 3.8: Методы exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() теперь возвращают False вместо вызова исключения для путей, содержащих символы, не представимые на уровне ОС.
Изменено в версии 3.14: Перечисленные выше методы теперь возвращают False вместо вызова любого исключения OSError со стороны операционной системы. В предыдущих версиях вызывались исключения OSError некоторых типов, а остальные подавлялись. Новое поведение согласуется с os.path.exists(), os.path.isdir() и т. д. Используйте stat(), чтобы получить сведения о состоянии файла без подавления исключений.
-
Path.stat(*, follow_symlinks=True) -
Возвращает объект
os.stat_result, содержащий сведения об этом пути, как иos.stat(). Результат запрашивается при каждом вызове этого метода.Обычно этот метод следует по символическим ссылкам; чтобы получить сведения о самой символической ссылке, добавьте аргумент
follow_symlinks=Falseили используйтеlstat().>>> p = Path('setup.py') >>> p.stat().st_size 956 >>> p.stat().st_mtime 1327883547.852554Изменено в версии 3.10: Добавлен параметр follow_symlinks.
-
Path.lstat() -
Аналогичен
Path.stat(), но если путь указывает на символическую ссылку, возвращает сведения о самой ссылке, а не о её целевом объекте.
-
Path.exists(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на существующий файл или каталог. Если путь некорректен, недоступен или отсутствует, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.Обычно этот метод следует по символическим ссылкам; чтобы проверить существование самой символической ссылки, добавьте аргумент
follow_symlinks=False.>>> Path('.').exists() True >>> Path('setup.py').exists() True >>> Path('/etc').exists() True >>> Path('nonexistentfile').exists() FalseИзменено в версии 3.12: Добавлен параметр follow_symlinks.
-
Path.is_file(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на обычный файл. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся обычным файлом, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.Обычно этот метод следует по символическим ссылкам; чтобы не учитывать символические ссылки, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Добавлен параметр follow_symlinks.
-
Path.is_dir(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на каталог. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся каталогом, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.Обычно этот метод следует по символическим ссылкам; чтобы не учитывать символические ссылки на каталоги, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Добавлен параметр follow_symlinks.
-
Path.is_symlink() -
Возвращает
True, если путь указывает на символическую ссылку, даже если она не работает. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся символической ссылкой, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.
-
Path.is_junction() -
Возвращает
True, если путь указывает на точку соединения, иFalseдля любого другого типа файла. В настоящее время точки соединения поддерживаются только в Windows.Добавлено в версии 3.12.
-
Path.is_mount() -
Возвращает
True, если путь является точкой монтирования: точкой в файловой системе, в которой смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог path,path/.., на другом устройстве, чем path, или указывают лиpath/..и path на один и тот же индексный дескриптор на одном устройстве — это должно обнаруживать точки монтирования во всех вариантах Unix и POSIX. В Windows точкой монтирования считается корень диска (например,c:\), общий ресурс UNC (например,\\server\share) или каталог смонтированной файловой системы.Добавлено в версии 3.7.
Изменено в версии 3.12: Добавлена поддержка Windows.
-
Path.is_socket() -
Возвращает
True, если путь указывает на сокет Unix. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся сокетом Unix, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.
-
Path.is_fifo() -
Возвращает
True, если путь указывает на FIFO. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся FIFO, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.
-
Path.is_block_device() -
Возвращает
True, если путь указывает на блочное устройство. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся блочным устройством, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.
-
Path.is_char_device() -
Возвращает
True, если путь указывает на символьное устройство. Если путь некорректен, недоступен или отсутствует либо указывает на объект, не являющийся символьным устройством, возвращаетсяFalse. ИспользуйтеPath.stat(), чтобы различить эти случаи.
-
Path.samefile(other_path) -
Возвращает, указывает ли этот путь на тот же файл, что и other_path, который может быть объектом Path или строкой. Семантика аналогична
os.path.samefile()иos.path.samestat().Может быть вызвано исключение
OSError, если по какой-либо причине нет доступа к одному из файлов.>>> p = Path('spam') >>> q = Path('eggs') >>> p.samefile(q) False >>> p.samefile('spam') TrueДобавлено в версии 3.5.
-
Path.info -
Объект
PathInfo, поддерживающий получение сведений о типе файла. Объект предоставляет методы, кэширующие результаты, что может помочь сократить количество системных вызовов при проверке типа файла. Например:>>> p = Path('src') >>> if p.info.is_symlink(): ... print('symlink') ... elif p.info.is_dir(): ... print('directory') ... elif p.info.exists(): ... print('something else') ... else: ... print('not found') ... directoryЕсли путь был получен с помощью
Path.iterdir(), этот атрибут инициализируется некоторыми сведениями о типе файла, полученными при сканировании родительского каталога. Простое обращение кPath.infoне приводит к запросам к файловой системе.Чтобы получить актуальные сведения, лучше вызывать
Path.is_dir(),is_file()иis_symlink(), а не методы этого атрибута. Сбросить кэш нельзя; вместо этого можно создать новый объект пути с пустым кэшем info с помощьюp = Path(p).Добавлено в версии 3.14.
Чтение и запись файлов
-
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) -
Открывает файл, на который указывает путь, подобно встроенной функции
open():>>> p = Path('setup.py') >>> with p.open() as f: ... f.readline() ... '#!/usr/bin/env python3\n'
-
Path.read_text(encoding=None, errors=None, newline=None) -
Возвращает декодированное содержимое файла, на который указывает путь, в виде строки:
>>> p = Path('my_text_file') >>> p.write_text('Text file contents') 18 >>> p.read_text() 'Text file contents'Файл открывается, а затем закрывается. Необязательные параметры имеют то же значение, что и в
open().Добавлено в версии 3.5.
Изменено в версии 3.13: Добавлен параметр newline.
-
Path.read_bytes() -
Возвращает двоичное содержимое файла, на который указывает путь, в виде объекта bytes:
>>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') 20 >>> p.read_bytes() b'Binary file contents'Добавлено в версии 3.5.
-
Path.write_text(data, encoding=None, errors=None, newline=None) -
Открывает файл, на который указывает путь, в текстовом режиме, записывает в него data и закрывает файл:
>>> p = Path('my_text_file') >>> p.write_text('Text file contents') 18 >>> p.read_text() 'Text file contents'Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют то же значение, что и в
open().Добавлено в версии 3.5.
Изменено в версии 3.10: Добавлен параметр newline.
-
Path.write_bytes(data) -
Открывает файл, на который указывает путь, в двоичном режиме, записывает в него data и закрывает файл:
>>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') 20 >>> p.read_bytes() b'Binary file contents'Существующий файл с таким же именем перезаписывается.
Добавлено в версии 3.5.
Чтение каталогов
-
Path.iterdir() -
Если путь указывает на каталог, возвращает объекты путей для его содержимого:
>>> p = Path('docs') >>> for child in p.iterdir(): child ... PosixPath('docs/conf.py') PosixPath('docs/_templates') PosixPath('docs/make.bat') PosixPath('docs/index.rst') PosixPath('docs/_build') PosixPath('docs/_static') PosixPath('docs/Makefile')Дочерние элементы возвращаются в произвольном порядке; специальные элементы
'.'и'..'не включаются. Если после создания итератора из каталога удалить файл или добавить в него файл, не определено, будет ли объект пути для этого файла включён в результат.Если путь не является каталогом или к нему нет доступа по другой причине, возникает исключение
OSError.
-
Path.glob(pattern, *, case_sensitive=None, recurse_symlinks=False) -
Выполняет поиск по заданному относительному шаблону pattern в каталоге, представленном этим путём, и возвращает все соответствующие файлы (любого типа):
>>> sorted(Path('.').glob('*.py')) [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')] >>> sorted(Path('.').glob('*/*.py')) [PosixPath('docs/conf.py')] >>> sorted(Path('.').glob('**/*.py')) [PosixPath('build/lib/pathlib.py'), PosixPath('docs/conf.py'), PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]Примечание
Пути возвращаются в произвольном порядке. Если нужен определённый порядок, отсортируйте результаты.
См. также
Документацию по языку шаблонов.
По умолчанию, а также если аргумент только по ключевому слову case_sensitive задан равным
None, этот метод сопоставляет пути с учётом правил регистра, специфичных для платформы: обычно с учётом регистра в POSIX и без учёта регистра в Windows. Задайте для case_sensitive значениеTrueилиFalse, чтобы изменить это поведение.По умолчанию, а также если аргумент только по ключевому слову recurse_symlinks задан равным
False, этот метод следует по символическим ссылкам, за исключением случаев раскрытия подстановочных знаков «**». Задайте для recurse_symlinks значениеTrue, чтобы всегда следовать по символическим ссылкам.Примечание
Все исключения
OSError, возникающие при сканировании файловой системы, подавляются. Сюда входитPermissionErrorпри доступе к каталогам без разрешения на чтение.Вызывает событие аудита
pathlib.Path.globс аргументамиself,pattern.Изменено в версии 3.12: Добавлен параметр case_sensitive.
Изменено в версии 3.13: Добавлен параметр recurse_symlinks.
Изменено в версии 3.13: Параметр pattern принимает объект, подобный пути.
Изменено в версии 3.13: Все исключения
OSError, возникающие при сканировании файловой системы, подавляются. В предыдущих версиях такие исключения подавлялись во многих, но не во всех случаях.
-
Path.rglob(pattern, *, case_sensitive=None, recurse_symlinks=False) -
Рекурсивно выполняет поиск по заданному относительному шаблону pattern. Это аналог вызова
Path.glob()с добавлением «**/» перед шаблоном pattern.Примечание
Пути возвращаются в произвольном порядке. Если нужен определённый порядок, отсортируйте результаты.
Примечание
Все исключения
OSError, возникающие при сканировании файловой системы, подавляются. Сюда входитPermissionErrorпри доступе к каталогам без разрешения на чтение.См. также
Документацию по языку шаблонов и
Path.glob().Вызывает событие аудита
pathlib.Path.rglobс аргументамиself,pattern.Изменено в версии 3.12: Добавлен параметр case_sensitive.
Изменено в версии 3.13: Добавлен параметр recurse_symlinks.
Изменено в версии 3.13: Параметр pattern принимает объект, подобный пути.
-
Path.walk(top_down=True, on_error=None, follow_symlinks=False) -
Перебирает дерево каталогов сверху вниз или снизу вверх и генерирует имена файлов.
Для каждого каталога в дереве, корнем которого является self (включая self, но исключая «.» и «..»), метод возвращает 3-элементный кортеж
(dirpath, dirnames, filenames).dirpath — это
Pathтекущего перебираемого каталога, dirnames — список строк с именами подкаталогов в dirpath (за исключением'.'и'..'), а filenames — список строк с именами файлов в dirpath, не являющихся каталогами. Чтобы получить полный путь (начинающийся с self) к файлу или каталогу в dirpath, используйтеdirpath / name. Сортировка списков зависит от файловой системы.Если необязательный аргумент top_down имеет значение true (по умолчанию), кортеж для каталога генерируется до кортежей для любых его подкаталогов (каталоги обходятся сверху вниз). Если top_down имеет значение false, кортеж для каталога генерируется после кортежей для всех его подкаталогов (каталоги обходятся снизу вверх). Независимо от значения top_down, список подкаталогов извлекается до обхода кортежей для каталога и его подкаталогов.
Если top_down имеет значение true, вызывающий код может изменить список dirnames на месте (например, с помощью
delили присваивания срезу), иPath.walk()выполнит рекурсивный обход только тех подкаталогов, имена которых остались в dirnames. Это можно использовать, чтобы отсечь часть поиска, задать определённый порядок обхода или даже сообщитьPath.walk()о каталогах, созданных или переименованных вызывающим кодом до возобновленияPath.walk(). Изменение dirnames, когда top_down имеет значение false, не влияет на поведениеPath.walk(), поскольку каталоги из dirnames уже обработаны к моменту передачи списка вызывающему коду.По умолчанию ошибки от
os.scandir()игнорируются. Если задан необязательный аргумент on_error, он должен быть вызываемым объектом; ему будет передан один аргумент — экземплярOSError. Вызываемый объект может обработать ошибку, чтобы продолжить обход, или повторно вызвать её, чтобы остановить обход. Обратите внимание, что имя файла доступно в атрибутеfilenameобъекта исключения.По умолчанию
Path.walk()не следует по символическим ссылкам, а добавляет их в список filenames. Задайте для follow_symlinks значение true, чтобы разрешать символические ссылки и помещать их в dirnames или filenames в зависимости от их целей, а следовательно, посещать каталоги, на которые указывают символические ссылки (если это поддерживается).Примечание
Имейте в виду, что установка для follow_symlinks значения true может привести к бесконечной рекурсии, если ссылка указывает на родительский каталог.
Path.walk()не отслеживает уже посещённые каталоги.Примечание
Path.walk()предполагает, что каталоги, которые оно обходит, не изменяются во время выполнения. Например, если каталог из dirnames заменён символической ссылкой и follow_symlinks имеет значение false,Path.walk()всё равно попытается перейти в него. Чтобы предотвратить такое поведение, удаляйте соответствующие каталоги из dirnames.Примечание
В отличие от
os.walk(),Path.walk()помещает символические ссылки на каталоги в список filenames, если follow_symlinks имеет значение false.В этом примере отображается количество байтов, используемых всеми файлами в каждом каталоге, при этом каталоги
__pycache__игнорируются:from pathlib import Path for root, dirs, files in Path("cpython/Lib/concurrent").walk(on_error=print): print( root, "consumes", sum((root / file).stat().st_size for file in files), "bytes in", len(files), "non-directory files" ) if '__pycache__' in dirs: dirs.remove('__pycache__')Следующий пример представляет собой простую реализацию
shutil.rmtree(). Обход дерева снизу вверх необходим, посколькуrmdir()не позволяет удалить каталог, пока он не опустеет:# Delete everything reachable from the directory "top". # CAUTION: This is dangerous! For example, if top == Path('/'), # it could delete all of your files. for root, dirs, files in top.walk(top_down=False): for name in files: (root / name).unlink() for name in dirs: (root / name).rmdir()Добавлено в версии 3.12.
Создание файлов и каталогов
-
Path.touch(mode=0o666, exist_ok=True) -
Создаёт файл по указанному пути. Если задан mode, он объединяется со значением
umaskпроцесса для определения режима файла и флагов доступа. Если файл уже существует, функция завершается успешно, когда exist_ok имеет значение true (при этом время изменения файла обновляется до текущего); в противном случае возникает исключениеFileExistsError.См. также
Для создания файлов часто используют методы
open(),write_text()иwrite_bytes().
-
Path.mkdir(mode=0o777, parents=False, exist_ok=False) -
Создаёт каталог по указанному пути. Если задан mode, он объединяется со значением
umaskпроцесса для определения режима файла и флагов доступа. Если путь уже существует, возникает исключениеFileExistsError.Если parents имеет значение true, при необходимости создаются все отсутствующие родительские каталоги этого пути; они создаются с разрешениями по умолчанию, без учёта mode (как в команде POSIX
mkdir -p).Если parents имеет значение false (по умолчанию), отсутствие родительского каталога приводит к исключению
FileNotFoundError.Если exist_ok имеет значение false (по умолчанию), возникает исключение
FileExistsError, если целевой каталог уже существует.Если exist_ok имеет значение true, исключение
FileExistsErrorне возникнет, если только указанный путь уже не существует в файловой системе и не является каталогом (поведение совпадает с командой POSIXmkdir -p).Изменено в версии 3.5: Добавлен параметр exist_ok.
-
Path.symlink_to(target, target_is_directory=False) -
Создаёт для этого пути символическую ссылку на target.
В Windows символическая ссылка представляет собой файл или каталог и не меняется динамически вслед за целью. Если цель существует, тип создаваемой символической ссылки будет соответствовать её типу. В противном случае символическая ссылка будет создана как ссылка на каталог, если target_is_directory имеет значение true, или как ссылка на файл (по умолчанию). На платформах, отличных от Windows, аргумент target_is_directory игнорируется.
>>> p = Path('mylink') >>> p.symlink_to('setup.py') >>> p.resolve() PosixPath('/home/antoine/pathlib/setup.py') >>> p.stat().st_size 956 >>> p.lstat().st_size 8Примечание
Порядок аргументов (ссылка, цель) обратен порядку аргументов в
os.symlink().Изменено в версии 3.13: Вызывает исключение
UnsupportedOperation, еслиos.symlink()недоступна. В предыдущих версиях возникало исключениеNotImplementedError.
-
Path.hardlink_to(target) -
Создаёт для этого пути жёсткую ссылку на тот же файл, на который указывает target.
Примечание
Порядок аргументов (ссылка, цель) обратен порядку аргументов в
os.link().Добавлено в версии 3.10.
Изменено в версии 3.13: Вызывает исключение
UnsupportedOperation, еслиos.link()недоступна. В предыдущих версиях возникало исключениеNotImplementedError.
Копирование, перемещение и удаление
-
Path.copy(target, *, follow_symlinks=True, preserve_metadata=False) -
Копирует этот файл или дерево каталогов в указанный target и возвращает новый экземпляр
Path, указывающий на target.Если исходный объект — файл, существующий файл в целевом расположении будет заменён. Если исходный объект — символическая ссылка, а follow_symlinks имеет значение true (по умолчанию), копируется цель ссылки. В противном случае в месте назначения создаётся копия символической ссылки.
Если preserve_metadata имеет значение false (по умолчанию), гарантируется копирование только структуры каталогов и данных файлов. Задайте для preserve_metadata значение true, чтобы копировались разрешения для файлов и каталогов, флаги, время последнего доступа и изменения, а также расширенные атрибуты, если это поддерживается. Этот аргумент не влияет на копирование файлов в Windows (где метаданные всегда сохраняются).
Примечание
Если это поддерживается операционной системой и файловой системой, метод выполняет облегчённое копирование: блоки данных копируются только при изменении. Такой способ называется копированием при записи.
Добавлено в версии 3.14.
-
Path.copy_into(target_dir, *, follow_symlinks=True, preserve_metadata=False) -
Копирует этот файл или дерево каталогов в указанный target_dir, который должен быть существующим каталогом. Остальные аргументы обрабатываются так же, как в
Path.copy(). Возвращает новый экземплярPath, указывающий на копию.Добавлено в версии 3.14.
-
Path.rename(target) -
Переименовывает этот файл или каталог в указанный target и возвращает новый экземпляр
Path, указывающий на target. В Unix, если target существует и является файлом, он будет заменён без предупреждения, если у пользователя есть соответствующее разрешение. В Windows, если target существует, возникнет исключениеFileExistsError. В качестве target можно указать строку или другой объект пути:>>> p = Path('foo') >>> p.open('w').write('some text') 9 >>> target = Path('bar') >>> p.rename(target) PosixPath('bar') >>> target.open().read() 'some text'Целевой путь может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, а не каталога объекта
Path.Метод реализован на основе
os.rename()и предоставляет те же гарантии.Изменено в версии 3.8: Добавлено возвращаемое значение: возвращается новый экземпляр
Path.
-
Path.replace(target) -
Переименовывает этот файл или каталог в указанный target и возвращает новый экземпляр
Path, указывающий на target. Если target указывает на существующий файл или пустой каталог, он будет заменён безусловно.Целевой путь может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, а не каталога объекта
Path.Изменено в версии 3.8: Добавлено возвращаемое значение: возвращается новый экземпляр
Path.
-
Path.move(target) -
Перемещает этот файл или дерево каталогов в указанный target и возвращает новый экземпляр
Path, указывающий на target.Если target не существует, он будет создан. Если этот путь и target указывают на существующие файлы, целевой файл будет перезаписан. Если оба пути указывают на один и тот же файл или каталог либо target является непустым каталогом, возникает исключение
OSError.Если оба пути находятся в одной файловой системе, перемещение выполняется с помощью
os.replace(). В противном случае этот путь копируется (с сохранением метаданных и символических ссылок), а затем удаляется.Добавлено в версии 3.14.
-
Path.move_into(target_dir) -
Перемещает этот файл или дерево каталогов в указанный target_dir, который должен быть существующим каталогом. Возвращает новый экземпляр
Path, указывающий на перемещённый путь.Добавлено в версии 3.14.
-
Path.unlink(missing_ok=False) -
Удаляет этот файл или символическую ссылку. Если путь указывает на каталог, используйте вместо этого
Path.rmdir().Если missing_ok имеет значение false (по умолчанию), а путь не существует, возникает исключение
FileNotFoundError.Если missing_ok имеет значение true, исключения
FileNotFoundErrorигнорируются (поведение совпадает с командой POSIXrm -f).Изменено в версии 3.8: Добавлен параметр missing_ok.
-
Path.rmdir() -
Удаляет этот каталог. Каталог должен быть пустым.
Разрешения и владение
-
Path.owner(*, follow_symlinks=True) -
Возвращает имя пользователя, которому принадлежит файл. Если идентификатор пользователя файла (UID) не найден в системной базе данных, возникает исключение
KeyError.Обычно этот метод следует по символическим ссылкам; чтобы получить владельца самой символической ссылки, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Вызывает исключение
UnsupportedOperation, если модульpwdнедоступен. В предыдущих версиях возникало исключениеNotImplementedError.Изменено в версии 3.13: Добавлен параметр follow_symlinks.
-
Path.group(*, follow_symlinks=True) -
Возвращает имя группы, которой принадлежит файл. Если идентификатор группы файла (GID) не найден в системной базе данных, возникает исключение
KeyError.Обычно этот метод следует по символическим ссылкам; чтобы получить группу самой символической ссылки, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Вызывает исключение
UnsupportedOperation, если модульgrpнедоступен. В предыдущих версиях возникало исключениеNotImplementedError.Изменено в версии 3.13: Добавлен параметр follow_symlinks.
-
Path.chmod(mode, *, follow_symlinks=True) -
Изменяет режим и разрешения файла, как
os.chmod().Обычно этот метод следует по символическим ссылкам. Некоторые разновидности Unix поддерживают изменение разрешений самой символической ссылки; на таких платформах можно добавить аргумент
follow_symlinks=Falseили использоватьlchmod().>>> p = Path('setup.py') >>> p.stat().st_mode 33277 >>> p.chmod(0o444) >>> p.stat().st_mode 33060Изменено в версии 3.10: Добавлен параметр follow_symlinks.
-
Path.lchmod(mode) -
Работает как
Path.chmod(), но если путь указывает на символическую ссылку, изменяется режим самой ссылки, а не её цели.
Язык шаблонов
В шаблонах для full_match(), glob() и rglob() поддерживаются следующие подстановочные знаки:
-
** (entire segment) -
Соответствует любому количеству компонентов пути — файлов или каталогов, включая ноль.
-
* (entire segment) -
Соответствует одному компоненту пути — файлу или каталогу.
-
* (part of a segment) -
Соответствует любому количеству символов, кроме разделителей, включая ноль.
-
? -
Соответствует одному символу, кроме разделителя.
-
[seq] -
Соответствует одному символу из seq, где seq — последовательность символов. Поддерживаются диапазоны; например,
[a-z]соответствует любой строчной букве ASCII. Несколько диапазонов можно объединять:[a-zA-Z0-9_]соответствует любой букве ASCII, цифре или символу подчёркивания. -
[!seq] -
Соответствует одному символу, не входящему в seq, где для seq действуют те же правила, что и выше.
Чтобы выполнить буквальное сопоставление, заключите метасимволы в квадратные скобки. Например, "[?]" соответствует символу "?".
Подстановочный знак «**» включает рекурсивный поиск по шаблону. Несколько примеров:
Шаблон | Значение |
|---|---|
« | Любой путь как минимум с одним компонентом. |
« | Любой путь, последний компонент которого заканчивается на « |
« | Любой путь, начинающийся с « |
« | Любой путь, начинающийся с « |
Примечание
Поиск по шаблону с подстановочным знаком «**» охватывает каждый каталог в дереве. Поиск в больших деревьях каталогов может занять много времени.
Изменено в версии 3.13: Поиск по шаблону, заканчивающемуся на «**», возвращает и файлы, и каталоги. В предыдущих версиях возвращались только каталоги.
В Path.glob() и rglob() к шаблону можно добавить завершающий символ косой черты, чтобы находить только каталоги.
Сравнение с модулем glob
Шаблоны, принимаемые, и результаты, генерируемые Path.glob() и Path.rglob(), немного отличаются от шаблонов и результатов модуля glob:
- Файлы, имена которых начинаются с точки, в pathlib не являются особенными. Это аналогично передаче
include_hidden=Trueфункцииglob.glob(). - Компоненты шаблона «
**» в pathlib всегда задают рекурсивный поиск. Это аналогично передачеrecursive=Trueфункцииglob.glob(). - Компоненты шаблона «
**» в pathlib по умолчанию не переходят по символическим ссылкам. Этому поведению нет эквивалента вglob.glob(), но для совместимого поведения можно передатьrecurse_symlinks=TrueфункцииPath.glob(). - Как и все объекты
PurePathиPath, значения, возвращаемыеPath.glob()иPath.rglob(), не содержат завершающих косых черт. - Значения, возвращаемые методами pathlib
path.glob()иpath.rglob(), содержат путь в качестве префикса, в отличие от результатовglob.glob(root_dir=path). - Значения, возвращаемые методами pathlib
path.glob()иpath.rglob(), могут включать сам путь, например при поиске по шаблону «**», тогда как результатыglob.glob(root_dir=path)никогда не содержат пустую строку, которая соответствовала бы пути.
Сравнение с модулями os и os.path
Модуль pathlib реализует операции с путями с помощью объектов PurePath и Path, поэтому его относят к объектно-ориентированному стилю. С другой стороны, модули os и os.path предоставляют функции, работающие с низкоуровневыми объектами str и bytes, что представляет собой более процедурный подход. Некоторые пользователи считают объектно-ориентированный стиль более удобным для чтения.
Многие функции в os и os.path поддерживают пути bytes и пути относительно файловых дескрипторов каталогов. Эти возможности недоступны в pathlib.
Типы str и bytes Python, а также части модулей os и os.path написаны на C и работают очень быстро. pathlib написан на чистом Python и часто работает медленнее, однако редко настолько медленно, чтобы это имело значение.
Нормализация путей в pathlib несколько более последовательна и основана на более определённых правилах, чем в os.path. Например, os.path.abspath() удаляет из пути сегменты «..», что может изменить его смысл при наличии символических ссылок, тогда как Path.absolute() сохраняет эти сегменты для большей безопасности.
Нормализация путей в pathlib может сделать его неподходящим для некоторых приложений:
- pathlib нормализует
Path("my_folder/")вPath("my_folder"), что меняет смысл пути при передаче различным API операционной системы и утилитам командной строки. В частности, отсутствие завершающего разделителя может привести к тому, что путь будет распознан как файл или каталог, а не только как каталог. - pathlib нормализует
Path("./my_program")вPath("my_program"), что меняет смысл пути при его использовании в качестве пути поиска исполняемых файлов, например в командной оболочке или при запуске дочернего процесса. В частности, отсутствие разделителя в пути может привести к поиску вPATH, а не в текущем каталоге.
Из-за этих различий pathlib не является полной заменой os.path.
Соответствующие инструменты
В таблице ниже сопоставлены различные функции os с соответствующими эквивалентами в PurePath/Path.
| |
|---|---|
Сноски
Протоколы
Модуль pathlib.types предоставляет типы для статической проверки типов.
Добавлено в версии 3.14.
-
class pathlib.types.PathInfo -
typing.Protocol, описывающий атрибутPath.info. Реализации могут возвращать из своих методов кэшированные результаты.-
exists(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на существующий файл или каталог либо на файл любого другого типа; возвращаетFalse, если путь не существует.Если follow_symlinks имеет значение
False, для символических ссылок возвращаетTrue, не проверяя, существуют ли цели ссылок.
-
is_dir(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на каталог или на символическую ссылку, ведущую к каталогу; возвращаетFalse, если путь указывает (или ведёт) на файл любого другого типа либо не существует.Если follow_symlinks имеет значение
False, возвращаетTrueтолько в том случае, если путь указывает на каталог (без перехода по символическим ссылкам); возвращаетFalse, если путь указывает на файл любого другого типа либо не существует.
-
is_file(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на файл или на символическую ссылку, ведущую к файлу; возвращаетFalse, если путь указывает (или ведёт) на каталог или другой объект, не являющийся файлом, либо не существует.Если follow_symlinks имеет значение
False, возвращаетTrueтолько в том случае, если путь указывает на файл (без перехода по символическим ссылкам); возвращаетFalse, если путь указывает на каталог или другой объект, не являющийся файлом, либо не существует.
-
is_symlink() -
Возвращает
True, если путь является символической ссылкой (даже если она не работает); возвращаетFalse, если путь указывает на каталог или файл любого типа либо не существует.
-
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/pathlib.html