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

Класс pathlib.PurePath() и его подклассы

Правильная обработка путей разных файловых систем

Объекты pathlib.PurePath() обеспечивают операции обработки пути, которые фактически не обращаются к файловой системе. Эти классы можно использовать для манипулирования путями Windows на машине Unix или наоборот, они так же позволяют правильно обрабатывать пути.

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

Можно создавать и использовать экземпляры всех этих классов независимо от системы в которой вы работаете, поскольку они не предоставляют никаких операций, выполняющих системные вызовы.

Три класса представляющих объект пути:

pathlib.PurePath(*pathsegments):

Универсальный класс pathlib.PurePath(), который представляет системный тип пути. Его экземпляр создает либо pathlib.PurePosixPath, либо pathlib.PureWindowsPath, в зависимости от операционной системы на которой выполняется код.

Класс pathlib.PurePath() обеспечивают операции обработки пути, которые фактически не обращаются к файловой системе.

Аргумент pathsegments представляет собой сегменты пути файловой системы которые нужно обработать. Каждый элемент сегмента пути может быть либо строкой, либо объектом, реализующим интерфейс os.PathLike, который возвращает строку, либо другим объектом пути:

  • Когда pathsegments пуст, то предполагается текущий каталог.
  • Когда дается несколько абсолютных путей, последний берется в качестве якоря имитируя поведение os.path.join().
  • Лишние косые черты и одиночные точки будут удалены из результирующего пути, а двойные точки '..' - нет, так как это изменило бы значение пути перед символическими ссылками.
>>> import pathlib

# Код запущен на Unix системах
>>> path = pathlib.PurePath('/foo', 'bar', 'baz')
>>> path
# PurePosixPath('/foo/bar/baz')
>>> str(path)
# '/foo/bar/baz'

# Код запущен на Windows системе
>>> path = pathlib.PurePath('c:/', 'foo', 'bar')
>>> path
# PureWindowsPath('c:/foo/bar')
>>> str(path)
# 'c:\\foo\\bar'

pathlib.PurePosixPath(*pathsegments):

Класс pathlib.PurePosixPath() представляет собой подкласс pathlib.PurePath, этот вариант пути представляет пути файловой системы, отличные от Windows:

>>> import pathlib
>>> pathlib.PurePosixPath('/etc')
# PurePosixPath('/etc')

Аргумент pathsegments указывается аналогично классу pathlib.PurePath.

pathlib.PureWindowsPath(*pathsegments):

Класс pathlib.PureWindowsPath() представляет собой подкласс pathlib.PurePath, этот вариант пути представляет пути файловой системы Windows:

>>> import pathlib
>>> pathlib.PureWindowsPath('c:/Program Files/')
# PureWindowsPath('c:/Program Files')

Аргумент pathsegments указывается аналогично классу pathlib.PurePath.

Примеры использования:

>>> PurePath('foo', 'some/path', 'bar')
# PurePosixPath('foo/some/path/bar')
>>> PurePath(Path('foo'), Path('bar'))
# PurePosixPath('foo/bar')

Когда pathsegments пуст, то предполагается текущий каталог:

>>> PurePath()
# PurePosixPath('.')

Когда дается несколько абсолютных путей, последний берется в качестве основного:

>>> PurePath('/etc', '/usr', 'lib64')
# PurePosixPath('/usr/lib64')
>>> PureWindowsPath('c:/Windows', 'd:bar')
# PureWindowsPath('d:bar')

В пути Windows изменение локального корня не отменяет предыдущую настройку диска:

>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')

Лишние косые черты и одиночные точки свернуты, а двойные точки '..' - нет:

>>> PurePath('foo//bar')
# PurePosixPath('foo/bar')
>>> PurePath('foo/./bar')
# PurePosixPath('foo/bar')
>>> PurePath('foo/../bar')
# PurePosixPath('foo/../bar')

Наивный подход к вычислению пути сделал бы путь Posix 'foo/.. /bar' эквивалентно PurePosixPath('bar'), что неверно, если foo является символической ссылкой на другой каталог.

Свойства объекта пути:

Пути неизменны и хешированы. Пути одной и той же файловой системы являются сопоставимыми и упорядочиваемыми. Эти свойства соответствуют семантике складывания сегментов пути файловой системы.

>>> PurePosixPath('foo') == PurePosixPath('FOO')
# False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
# True
>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
# True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
# True

Одинаковые пути разных файловых систем НЕ равны, при сравнении будут давать результат False и не могут быть отсортированы:

>>> 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():

# Сложение путей файловой системы
>>> p = PurePath('/etc')
>>> p
# PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
# PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
# PurePosixPath('/usr/bin')

Объект path можно использовать везде, где принят объект, реализующий класс 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() дает необработанный путь к файловой системе в виде объекта байтов, закодированный os.fsencode():

>>> bytes(p)
# b'/etc'

Примечание Перевод объекта пути в необработанный путь к файловой системе рекомендуется только в Unix. В Windows форма Unicode - это каноническое представление путей файловой системы.