Получение компонентов, сравнение и проверка пути файловой системы.
Описанные ниже свойства и методы позволяют легко
манипулировать с путями файловой системы без осуществления системных вызовов. Другими словами, при помощи этого класса можно проводить операции с путями, которых нет в файловой системе.
Содержание:
Примечание: Все приведенные ниже операции поддерживаются
классом pathlib.Path()
, т.к. он является подклассом
pathlib.PurePath()
.
PurePath.parts
:
Свойство
PurePath.parts
возвращает
кортеж, дающее доступ к отдельным частям/компонентам пути. Полученный кортеж представляет собой последовательность сегментов пути, проанализированных на основе значения разделителя пути.
Обратите внимание, как диск и локальный корень перегруппированы в одну часть.
>>> import pathlib
>>> p = pathlib.PurePath('/usr/bin/python3')
>>> p.parts
# ('/', 'usr', 'bin', 'python3')
>>> p = pathlib.PurePath('c:/Program Files/PSF')
>>> p.parts
# ('c:\\', 'Program Files', 'PSF')
PurePath.drive
:
Свойство
PurePath.drive
возвращает
строку, представляющую букву или имя диска, если есть:
>>> import pathlib
>>> pathlib.PurePath('c:/Program Files/').drive
# 'c:'
>>> pathlib.PurePath('/Program Files/').drive
# ''
>>> pathlib.PurePath('/etc').drive
# ''
Расширения UNC также считаются дисками:
>>> import pathlib
>>> pathlib.PurePath('//host/share/foo.txt').drive
# '\\\\host\\share'
PurePath.root
:
Свойство
PurePath.root
возвращает
строку, представляющую локальный или глобальный корень, если есть:
>>> import pathlib
>>> pathlib.PurePath('c:/Program Files/').root
# '\\'
>>> pathlib.PurePath('c:Program Files/').root
# ''
>>> pathlib.PurePath('/etc').root
# '/'
У UNC расширения тоже всегда есть корень:
>>> import pathlib
>>> pathlib.PurePath('//host/share').root
# '\\'
PurePath.anchor
:
Свойство
PurePath.anchor
возвращает
строку, представляющую конкатенацию диска и корня:
>>> import pathlib
>>> pathlib.PurePath('c:/Program Files/').anchor
# 'c:\\'
>>> pathlib.PurePath('c:Program Files/').anchor
# 'c:'
>>> pathlib.PurePath('/etc').anchor
# '/'
>>> pathlib.PurePath('//host/share').anchor
# '\\\\host\\share\\'
PurePath.parents
:
Свойство PurePath.parents
представляет собой неизменную последовательность, обеспечивающую доступ к логическим предкам пути:
Изменено в Python 3.10:
PurePath.parents
теперь поддерживает
срезы и отрицательные значения индекса.
>>> import pathlib
>>> p = pathlib.PurePath('c:/foo/bar/setup.py')
>>> p.parents[0]
# PureWindowsPath('c:/foo/bar')
>>> p.parents[1]
# PureWindowsPath('c:/foo')
>>> p.parents[2]
# PureWindowsPath('c:/')
# Двигаемся вверх по директории
>>> for up in p.parents:
... print(up)
...
# c:\foo\bar
# c:\foo
# c:\
PurePath.parent
:
Свойство
PurePath.parent
возвращает
строку, представляющую логический родительский путь:
>>> import pathlib
>>> p = pathlib.PurePath('/a/b/c/d')
>>> p.parent
# PurePosixPath('/a/b/c')
Свойство не позволяет пройти мимо корневой директории или пустого пути:
>>> import pathlib
>>> p = pathlib.PurePath('/')
>>> p.parent
# PurePosixPath('/')
>>> p = pathlib.PurePath('.')
>>> p.parent
# PurePosixPath('.')
Заметка. Это чисто лексическая операция, отсюда и следующее поведение:
>>> import pathlib
>>> p = pathlib.PurePath('foo/..')
>>> p.parent
# PurePosixPath('foo')
Если необходимо вычислить произвольный путь файловой системы вверх, рекомендуется сначала вызвать
Path.resolve()
, чтобы разрешить символические ссылки и исключить компоненты
'..'
.
PurePath.name
:
Свойство
PurePath.name
возвращает
строку, представляющую конечный компонент пути, исключая диск и корень, если есть. Другими словами это имя файла или название последней директории в пути.
>>> import pathlib
>>> pathlib.PurePath('my/library/setup.py').name
# 'setup.py'
Имена дисков UNC не учитываются:
>>> import pathlib
>>> pathlib.PurePath('//some/share/setup.py').name
# 'setup.py'
>>> pathlib.PurePath('//some/share').name
# ''
PurePath.suffix
:
Свойство
PurePath.suffix
возвращает
строку, представляющую расширение файла, если есть:
>>> import pathlib
>>> pathlib.PurePath('my/library/setup.py').suffix
# '.py'
>>> pathlib.PurePath('my/library.tar.gz').suffix
# '.gz'
>>> pathlib.PurePath('my/library').suffix
# ''
PurePath.suffixes
:
Свойство
PurePath.suffixes
возвращает
список, представляющий расширения файла, если есть:
>>> import pathlib
>>> pathlib.PurePath('my/library.tar.gar').suffixes
# ['.tar', '.gar']
>>> pathlib.PurePath('my/library.tar.gz').suffixes
# ['.tar', '.gz']
>>> pathlib.PurePath('my/library').suffixes
# []
PurePath.stem
:
Свойство
PurePath.stem
возвращает
строку, представляющую последний компонент пути без суффикса:
>>> import pathlib
>>> pathlib.PurePath('my/library.tar.gz').stem
# 'library.tar'
>>> pathlib.PurePath('my/library.tar').stem
# 'library'
>>> pathlib.PurePath('my/library').stem
# 'library'
PurePath.as_posix()
:
Метод
PurePath.as_posix()
возвращает
строковое представление пути с косыми чертами
'/'
:
>>> import pathlib
>>> p = pathlib.PurePath('c:\\windows')
>>> str(p)
# 'c:\\windows'
>>> p.as_posix()
# 'c:/windows'
PurePath.as_uri()
:
Метод
PurePath.as_uri()
возвращает
строку, представляющую путь как file URI. если путь не абсолютен, то поднимается
исключение ValueError
.
>>> import pathlib
>>> p = PurePath('/etc/passwd')
>>> p.as_uri()
# 'file:///etc/passwd'
>>> p = PurePath('c:/Windows')
>>> p.as_uri()
# 'file:///c:/Windows'
PurePath.is_absolute()
:
Метод PurePath.is_absolute()
проверяет, является ли путь абсолютным или нет. Возвращает True
, если путь считается абсолютным. Путь считается абсолютным, если он имеет как корень так и диск, если это позволяет файловая система:
>>> import pathlib
>>> pathlib.PurePath('/a/b').is_absolute()
# True
>>> pathlib.PurePath('a/b').is_absolute()
# False
>>> pathlib.PurePath('c:/a/b').is_absolute()
# True
>>> pathlib.PurePath('/a/b').is_absolute()
# False
>>> pathlib.PurePath('c:').is_absolute()
# False
>>> pathlib.PurePath('//some/share').is_absolute()
# True
PurePath.is_reserved()
:PureWindowsPath
>>> import pathlib
>>> pathlib.PurePath('nul').is_reserved()
# True
>>> pathlib.PurePath('nul').is_reserved()
# False
Вызовы файловой системы на зарезервированных путях под Windows могут таинственно завершаться сбоем или иметь непредвиденные последствия.
PurePath.joinpath(*other)
:
Метод PurePath.joinpath()
объединяет исходный путь с каждым из аргументов other
по очереди:
>>> import pathlib
>>> pathlib.PurePath('/etc').joinpath('passwd')
# PurePosixPath('/etc/passwd')
>>> pathlib.PurePath('/etc').joinpath(PurePosixPath('passwd'))
# PurePosixPath('/etc/passwd')
>>> pathlib.PurePath('/etc').joinpath('init.d', 'apache2')
# PurePosixPath('/etc/init.d/apache2')
>>> pathlib.PurePath('c:').joinpath('/Program Files')
# PureWindowsPath('c:/Program Files')
PurePath.match(pattern)
:
Метод
PurePath.match()
сравнивает исходный путь с предоставленным шаблоном
pattern
в стиле
модуля glob
. Метод
PurePath.match
вернет
True
если сопоставление прошло успешно и
False
в противном случае.
Если шаблон pattern
должен быть относительным по отношению к сравниваемому пути. Сравниваемый путь может быть как относительным так и абсолютным, а сопоставление выполняется справа:
>>> import pathlib
>>> pathlib.PurePath('a/b.py').match('*.py')
# True
>>> pathlib.PurePath('/a/b/c.py').match('b/*.py')
# True
>>> pathlib.PurePath('/a/b/c.py').match('a/*.py')
# False
Если шаблон pattern
является абсолютным, то и путь должен быть абсолютным и весь путь должен совпадать:
>>> import pathlib
>>> pathlib.PurePath('/a.py').match('/*.py')
# True
>>> pathlib.PurePath('a/b.py').match('/*.py')
# False
Как и с другими методами, в Windows чувствительность к регистру не соблюдается:
>>> import pathlib
>>> pathlib.PurePath('b.py').match('*.PY')
# True
PurePath.relative_to(*other)
:
Метод
PurePath.relative_to()
вычисляет версию исходного пути относительно переданного в качестве аргумента пути
other
. Если это невозможно, то поднимается
исключение ValueError
:
>>> import pathlib
>>> p = pathlib.PurePath('/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 694, in relative_to
# .format(str(self), str(formatted)))
# ValueError: '/etc/passwd' does not start with '/usr'
PurePath.with_name(name)
:
Метод
PurePath.with_name()
возвращает новый объект пути с измененным
name
. Если исходный путь не имеет имени
name
, вызывается
исключение ValueError
:
>>> import pathlib
>>> p = pathlib.PurePath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
# PureWindowsPath('c:/Downloads/setup.py')
>>> p = pathlib.PurePath('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_suffix(suffix)
:
Метод
PurePath.with_suffix()
возвращает новый объект пути с измененным
suffix
. Если исходный путь не имеет расширения
suffix
, то к окончанию пути тупо добавляется переданный
suffix
.
Если суффикс suffix=''
- является пустой строкой, исходный суффикс удаляется:
>>> import pathlib
>>> p = pathlib.PurePath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
# PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = pathlib.PurePath('README')
>>> p.with_suffix('.txt')
# PureWindowsPath('README.txt')
>>> p = pathlib.PurePath('README.txt')
>>> p.with_suffix('')
# PureWindowsPath('README')