pathlib — Объектно-ориентированные пути к файловой системе
Добавлен в версии 3.4.
Исходный код: Lib/pathlib/
Этот модуль предлагает классы, представляющие пути к файловой системе с семантикой, подходящей для разных операционных систем. Классы путей разделены между чистыми путями, которые предоставляют чисто вычислительные операции без ввода-вывода, и конкретными путями, которые наследуют от чистых путей, но также предоставляют операции ввода-вывода.
Если вы никогда не использовали этот модуль ранее или просто не уверены, какой класс подходит для вашей задачи, Path — это, скорее всего, то, что вам нужно. Он создает конкретный путь для платформы, на которой выполняется код.
Чистые пути полезны в некоторых особых случаях; например:
- Если вы хотите манипулировать путями Windows на машине Unix (или наоборот). Вы не можете создать
WindowsPathпри выполнении на Unix, но вы можете создать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 Base Specifications Issue 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: Последовательность предков теперь поддерживает срезы и значения отрицательных индексов.
-
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 ''Это обычно называется расширением файла.
-
PurePath.suffixes -
Список расширений пути, часто называемых расширениями файлов:
>>> PurePosixPath('my/library.tar.gar').suffixes ['.tar', '.gar'] >>> PurePosixPath('my/library.tar.gz').suffixes ['.tar', '.gz'] >>> PurePosixPath('my/library').suffixes []
-
PurePath.stem -
Конечный компонент пути без расширения:
>>> PurePosixPath('my/library.tar.gz').stem 'library.tar' >>> PurePosixPath('my/library.tar').stem 'library' >>> PurePosixPath('my/library').stem 'library'
-
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: Этот метод устарел; используйте
os.path.isreserved()для обнаружения зарезервированных путей в Windows.
-
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')
-
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: Возбуждает
UnsupportedOperationв Windows. В предыдущих версиях вместо этого возбуждалосьNotImplementedError.
-
class pathlib.WindowsPath(*pathsegments) -
Подкласс
PathиPureWindowsPath, этот класс представляет конкретные пути файловой системы Windows:>>> WindowsPath('c:/', 'Users', 'Ximénez') WindowsPath('c:/Users/Ximénez')pathsegments задаётся аналогично
PurePath.Изменено в версии 3.13: Возбуждает
UnsupportedOperationна платформах, не являющихся Windows. В предыдущих версиях вместо этого возбуждалось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» и представлены в них, соответствуя 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.
-
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'По историческим причинам этот метод также доступен для объектов
PurePath. Однако его использование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 вместо повышения исключения для путей, содержащих символы, не представимые на уровне ОС.
-
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, если путь указывает на существующий файл или каталог.Этот метод обычно следует за символическими ссылками; чтобы проверить наличие символической ссылки, добавьте аргумент
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если он указывает на другой тип файла.Также возвращает
False, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.Этот метод обычно следует за символическими ссылками; чтобы исключить символические ссылки, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Параметр follow_symlinks был добавлен.
-
Path.is_dir(*, follow_symlinks=True) -
Возвращает
True, если путь указывает на каталог,Falseесли он указывает на другой тип файла.Также возвращает
False, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.Этот метод обычно следует за символическими ссылками; чтобы исключить символические ссылки на каталоги, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Параметр follow_symlinks был добавлен.
-
Path.is_symlink() -
Возвращает
True, если путь указывает на символическую ссылку,Falseв противном случае.Также возвращает
False, если путь не существует; другие ошибки (например, ошибки доступа) передаются.
-
Path.is_junction() -
Возвращает
True, если путь указывает на жёсткую ссылку, иFalseдля любого другого типа файла. В настоящее время жёсткие ссылки поддерживаются только Windows.Добавлена в версии 3.12.
-
Path.is_mount() -
Возвращает
True, если путь является точкой монтирования: точкой в файловой системе, где смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог path,path/.., на другом устройстве, чем path, или жеpath/..и path указывают на один и тот же узел i на одном и том же устройстве — это должно определять точки монтирования для всех вариантов Unix и POSIX. В Windows точка монтирования рассматривается как корень буквы диска (например,c:\), общая папка UNC (например,\\server\share) или каталог смонтированной файловой системы.Добавлена в версии 3.7.
Изменено в версии 3.12: Добавлена поддержка Windows.
-
Path.is_socket() -
Возвращает
True, если путь указывает на сокет Unix (или символическую ссылку, указывающую на сокет Unix),False, если он указывает на другой тип файла.Falseтакже возвращается, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.
-
Path.is_fifo() -
Возвращает
True, если путь указывает на FIFO (или символическую ссылку, указывающую на FIFO),False, если он указывает на другой тип файла.Falseтакже возвращается, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.
-
Path.is_block_device() -
Возвращает
True, если путь указывает на блочное устройство (или символическую ссылку, указывающую на блочное устройство),False, если он указывает на другой тип файла.Falseтакже возвращается, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.
-
Path.is_char_device() -
Возвращает
True, если путь указывает на символьное устройство (или символическую ссылку, указывающую на символьное устройство),False, если он указывает на другой тип файла.Falseтакже возвращается, если путь не существует или является прерванной символической ссылкой; другие ошибки (например, ошибки доступа) передаются.
-
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.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) -
Ищет файлы, соответствующие заданному относительному шаблону в каталоге, представленном этим путем, возвращая все соответствующие файлы (любого типа):
>>> 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для всегда следования за символическими ссылками.Возбуждает событие аудита аудита
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) -
Ищет файлы, соответствующие заданному относительному шаблону рекурсивно. Это аналогично вызову
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, но исключая «.’ и «..’), метод возвращает тройку
(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 уже сгенерированы к тому времени, когда 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.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.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) -
Возвращает имя пользователя, владеющего файлом.
KeyErrorвозникает, если идентификатор пользователя (UID) файла не найден в базе данных системы.Этот метод обычно следует за символическими ссылками; чтобы получить владельца символической ссылки, добавьте аргумент
follow_symlinks=False.Изменено в версии 3.13: Вызывает
UnsupportedOperation, если модульpwdнедоступен. В более ранних версиях вызывалосьNotImplementedError.Изменено в версии 3.13: Параметр follow_symlinks был добавлен.
-
Path.group(*, follow_symlinks=True) -
Возвращает имя группы, владеющей файлом.
KeyErrorвозникает, если идентификатор группы (GID) файла не найден в базе данных системы.Этот метод обычно следует за символическими ссылками; чтобы получить группу символической ссылки, добавьте аргумент
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] -
Совпадает с одним символом, не входящим в 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’s
path.glob()иpath.rglob()включают path в качестве префикса, в отличие от результатовglob.glob(root_dir=path). - Возвращаемые значения из pathlib’s
path.glob()иpath.rglob()могут включать path сам по себе, например, при поиске “**”, тогда как результатыglob.glob(root_dir=path)никогда не включают пустую строку, которая соответствовала бы path.
Сравнение с модулями os и os.path
pathlib реализует операции с путями, используя объекты PurePath и Path, поэтому его называют объектно-ориентированным. С другой стороны, модули os и os.path предоставляют функции, которые работают с низкоуровневыми str и bytes объектами, что является более процедурным подходом. Некоторые пользователи считают, что объектно-ориентированный стиль более читабелен.
Многие функции в os и os.path поддерживают bytes пути и пути, относительные к дескрипторам каталогов. Эти функции недоступны в pathlib.
Типы Python str и bytes и части модулей 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.
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/pathlib.html