Сообщить об ошибке.

Манипуляции с путями файловой системы средствами pathlib в Python.

Получение компонентов, сравнение и проверка пути файловой системы.

Описанные ниже свойства и методы позволяют легко манипулировать с путями файловой системы без осуществления системных вызовов.

Данные методы принадлежат экземпляру, созданному из класса PurePath(), стандартного модуля pathlib.

Содержание:


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 представляет собой неизменную последовательность, обеспечивающую доступ к логическим предкам пути:

>>> 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

Метод PurePath.is_reserved() c pathlib.PureWindowsPath возвращает True, если путь считается зарезервированным под Windows и False противном случае. С pathlib.PurePosixPath, всегда возвращает False.

>>> 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')