pathlib — Объектно-ориентированные пути к файловой системе

Добавлено в версии 3.4.

Исходный код: Lib/pathlib.py.


Этот модуль предлагает классы, представляющие пути файловой системы с семантикой, подходящей для различных операционных систем. Классы путей делятся на pure paths, которые обеспечивают чисто вычислительные операции без ввода/вывода, и concrete paths, которые наследуют от чистых путей, но также обеспечивают операции ввода/вывода.

../../_images/pathlib-inheritance.png

Если вы никогда раньше не использовали этот модуль или просто не уверены, какой класс подходит для вашей задачи, то Path, скорее всего, то, что вам нужно. Он инстанцирует concrete path для платформы, на которой выполняется код.

Чистые пути полезны в некоторых особых случаях; например:

  1. Если вы хотите работать с путями Windows на машине Unix (или наоборот). Вы не можете инстанцировать WindowsPath при работе на Unix, но вы можете инстанцировать PureWindowsPath.

  2. Вы хотите убедиться, что ваш код манипулирует только путями, не обращаясь к ОС. В этом случае может оказаться полезным инстанцирование одного из чистых классов, поскольку в них просто нет операций доступа к ОС.

См.также

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'

Чистые пути

Объекты «чистого пути» предоставляют операции обработки пути, которые на самом деле не обращаются к файловой системе. Существует три способа доступа к этим классам, которые мы также называем вкусами:

class pathlib.PurePath(*pathsegments)

Общий класс, представляющий вкус пути системы (его инстанцирование создает либо PurePosixPath, либо PureWindowsPath):

>>> PurePath('setup.py')      # Running on a Unix machine
PurePosixPath('setup.py')

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

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

>>> 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')
PurePosixPath('/etc')

pathsegments задается аналогично PurePath.

class pathlib.PureWindowsPath(*pathsegments)

Подкласс PurePath, этот аромат пути представляет пути файловой системы Windows, включая UNC paths:

>>> PureWindowsPath('c:/Program Files/')
PureWindowsPath('c:/Program Files')
>>> 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():

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

Примечание

Вызов bytes рекомендуется только под Unix. В Windows форма юникода является каноническим представлением путей к файловой системе.

Доступ к отдельным частям

Чтобы получить доступ к отдельным «частям» (компонентам) пути, используйте следующее свойство:

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.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 Pathname Resolution:

*»Имя пути, начинающееся с двух последовательных косых черт, может интерпретироваться в зависимости от реализации, хотя более двух ведущих косых черт должно рассматриваться как одна косая черта».

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: Последовательность родителей теперь поддерживает slices и отрицательные значения индекса.

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.as_uri()

Представьте путь в виде URI file. Если путь не является абсолютным, то возникает ошибка ValueError.

>>> p = PurePosixPath('/etc/passwd')
>>> p.as_uri()
'file:///etc/passwd'
>>> p = PureWindowsPath('c:/Windows')
>>> p.as_uri()
'file:///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)

Возвращает, является ли этот путь относительным по отношению к другому пути.

>>> p = PurePath('/etc/passwd')
>>> p.is_relative_to('/etc')
True
>>> p.is_relative_to('/usr')
False

Добавлено в версии 3.9.

PurePath.is_reserved()

При PureWindowsPath возвращается True, если путь считается зарезервированным в Windows, False в противном случае. При PurePosixPath всегда возвращается False.

>>> PureWindowsPath('nul').is_reserved()
True
>>> PurePosixPath('nul').is_reserved()
False

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

PurePath.joinpath(*other)

Вызов этого метода эквивалентен объединению пути с каждым из других аргументов по очереди:

>>> 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.match(pattern)

Сопоставить данный путь с предоставленным шаблоном в стиле glob. Возвращает True при успешном сопоставлении, False в противном случае.

Если шаблон является относительным, путь может быть как относительным, так и абсолютным, и сопоставление выполняется справа:

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

Если шаблон является абсолютным, путь должен быть абсолютным, и весь путь должен соответствовать:

>>> PurePath('/a.py').match('/*.py')
True
>>> PurePath('a/b.py').match('/*.py')
False

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

>>> PurePosixPath('b.py').match('*.PY')
False
>>> PureWindowsPath('b.py').match('*.PY')
True
PurePath.relative_to(*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 694, in relative_to
    .format(str(self), str(formatted)))
ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute.

ПРИМЕЧАНИЕ: Эта функция является частью PurePath и работает со строками. Она не проверяет и не обращается к базовой структуре файла.

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

Бетонные дорожки

Конкретные пути являются подклассами классов чистых путей. В дополнение к операциям, предоставляемым последними, они также предоставляют методы для выполнения системных вызовов над объектами пути. Существует три способа инстанцирования конкретных путей:

class pathlib.Path(*pathsegments)

Подкласс PurePath, этот класс представляет конкретные пути системного аромата путей (его инстанцирование создает либо PosixPath, либо WindowsPath):

>>> Path('setup.py')
PosixPath('setup.py')

pathsegments задается аналогично PurePath.

class pathlib.PosixPath(*pathsegments)

Подкласс классов Path и PurePosixPath, этот класс представляет конкретные пути файловой системы не-Windows:

>>> PosixPath('/etc')
PosixPath('/etc')

pathsegments задается аналогично PurePath.

class pathlib.WindowsPath(*pathsegments)

Подкласс классов Path и PureWindowsPath, этот класс представляет конкретные пути файловой системы Windows:

>>> WindowsPath('c:/Program Files/')
WindowsPath('c:/Program Files')

pathsegments задается аналогично PurePath.

Вы можете инстанцировать только тот вариант класса, который соответствует вашей системе (разрешение системных вызовов на несовместимых вариантах пути может привести к ошибкам или сбоям в вашем приложении):

>>> 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__,))
NotImplementedError: cannot instantiate 'WindowsPath' on your system

Методы

Конкретные пути предоставляют следующие методы в дополнение к методам чистых путей. Многие из этих методов могут вызывать ошибку OSError, если системный вызов не удался (например, потому что путь не существует).

Изменено в версии 3.8: exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() теперь возвращают False вместо того, чтобы вызывать исключение для путей, содержащих символы, непредставимые на уровне ОС.

classmethod Path.cwd()

Возвращает новый объект path, представляющий текущий каталог (как возвращено командой os.getcwd()):

>>> Path.cwd()
PosixPath('/home/antoine/pathlib')
classmethod Path.home()

Возвращает новый объект path, представляющий домашний каталог пользователя (как возвращено конструкцией os.path.expanduser() с ~). Если домашний каталог не может быть определен, выдается сообщение RuntimeError.

>>> Path.home()
PosixPath('/home/antoine')

Добавлено в версии 3.5.

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.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.exists()

Указывает ли путь на существующий файл или каталог:

>>> Path('.').exists()
True
>>> Path('setup.py').exists()
True
>>> Path('/etc').exists()
True
>>> Path('nonexistentfile').exists()
False

Примечание

Если путь указывает на симлинк, exists() возвращает, указывает ли симлинк на существующий файл или каталог.

Path.expanduser()

Возвращает новый путь с расширенными конструкциями ~ и ~user, как возвращает os.path.expanduser(). Если домашний каталог не может быть разрешен, выдается сообщение RuntimeError.

>>> p = PosixPath('~/films/Monty Python')
>>> p.expanduser()
PosixPath('/home/eric/films/Monty Python')

Добавлено в версии 3.5.

Path.glob(pattern)

Глобус заданного относительного шаблона в каталоге, представленном данным путем, выдавая все совпадающие файлы (любого типа):

>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]

Шаблоны такие же, как и для fnmatch, с добавлением «**», что означает «этот каталог и все подкаталоги, рекурсивно». Другими словами, это позволяет использовать рекурсивное глоббинг:

>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]

Примечание

Использование шаблона «**» в больших деревьях каталогов может занимать непомерно много времени.

Вызывает auditing event pathlib.Path.glob с аргументами self, pattern.

Path.group()

Возвращает имя группы, владеющей файлом. Если gid файла не найден в системной базе данных, выдается сообщение KeyError.

Path.is_dir()

Возвращает True, если путь указывает на каталог (или символическую ссылку, указывающую на каталог), False, если он указывает на файл другого типа.

False также возвращается, если путь не существует или является битым симлинком; другие ошибки (например, ошибки разрешения) распространяются.

Path.is_file()

Возвращает True, если путь указывает на обычный файл (или символическую ссылку, указывающую на обычный файл), False, если он указывает на файл другого типа.

False также возвращается, если путь не существует или является битым симлинком; другие ошибки (например, ошибки разрешения) распространяются.

Path.is_mount()

Возвращает True, если путь является mount point: точкой в файловой системе, где была смонтирована другая файловая система. На POSIX функция проверяет, находится ли родитель path, path/.., на другом устройстве, чем path, или указывают ли path/.. и path на один и тот же i-узел на одном и том же устройстве - это должно определить точки монтирования для всех вариантов Unix и POSIX. Не реализовано в Windows.

Добавлено в версии 3.7.

Возвращает True, если путь указывает на символическую ссылку, False в противном случае.

False также возвращается, если путь не существует; другие ошибки (например, ошибки разрешения) распространяются.

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

Дочерние файлы выдаются в произвольном порядке, а специальные записи '.' и '..' не включаются. Если файл удаляется или добавляется в каталог после создания итератора, включается ли объект пути для этого файла, не уточняется.

Path.lchmod(mode)

Аналогично Path.chmod(), но если путь указывает на символическую ссылку, то изменяется режим символической ссылки, а не ее цели.

Path.lstat()

Аналогично Path.stat(), но если путь указывает на символическую ссылку, возвращает информацию символической ссылки, а не ее цели.

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 будут игнорироваться (такое же поведение, как у команды POSIX mkdir -p), но только если последний компонент пути не является существующим недиректорным файлом.

Изменено в версии 3.5: Был добавлен параметр exist_ok.

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.owner()

Возвращает имя пользователя, владеющего файлом. Если uid файла не найден в системной базе данных, выдается сообщение KeyError.

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.read_text(encoding=None, errors=None)

Возвращает декодированное содержимое указанного файла в виде строки:

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

Файл открывается, а затем закрывается. Необязательные параметры имеют то же значение, что и в open().

Добавлено в версии 3.5.

Возвращает путь, на который указывает символическая ссылка (как возвращается os.readlink()):

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')

Добавлено в версии 3.9.

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.

Изменено в версии 3.8: Добавлено возвращаемое значение, возвращает новый экземпляр Path.

Path.replace(target)

Переименовать данный файл или каталог в заданный target и вернуть новый экземпляр Path, указывающий на target. Если target указывает на существующий файл или пустой каталог, он будет безусловно заменен.

Целевой путь может быть абсолютным или относительным. Относительные пути интерпретируются относительно текущего рабочего каталога, не каталога объекта Path.

Изменено в версии 3.8: Добавлено возвращаемое значение, возвращает новый экземпляр Path.

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, то выдается сообщение FileNotFoundError. Если strict равно False, путь разрешается настолько, насколько это возможно, и любой остаток добавляется без проверки его существования. Если на пути разрешения встречается бесконечный цикл, выдается сообщение RuntimeError.

Добавлено в версии 3.6: Аргумент strict (до версии 3.6 поведение является строгим).

Path.rglob(pattern)

Это похоже на вызов Path.glob() с добавлением «**/» перед заданным относительным шаблоном:

>>> sorted(Path().rglob("*.py"))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]

Вызывает auditing event pathlib.Path.rglob с аргументами self, pattern.

Path.rmdir()

Удалите этот каталог. Каталог должен быть пустым.

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.

Сделать этот путь символической ссылкой на цель. В Windows значение target_is_directory должно быть true (по умолчанию False), если целью ссылки является каталог. В POSIX значение 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().

Сделайте этот путь жесткой ссылкой на тот же файл, что и target.

Примечание

Порядок аргументов (ссылка, цель) обратный порядку аргументов os.link().

Добавлено в версии 3.10.

Сделайте target жесткой ссылкой на этот путь.

Предупреждение

Эта функция не делает данный путь жесткой ссылкой на цель, несмотря на подтекст имени функции и аргумента. Порядок аргументов (цель, ссылка) обратен порядку аргументов Path.symlink_to() и Path.hardlink_to(), но соответствует порядку аргументов os.link().

Добавлено в версии 3.8.

Не рекомендуется, начиная с версии 3.10: Этот метод устарел в пользу Path.hardlink_to(), так как порядок аргументов Path.link_to() не соответствует порядку аргументов Path.symlink_to().

Path.touch(mode=0o666, exist_ok=True)

Создать файл по заданному пути. Если задан mode, то он комбинируется со значением umask процесса для определения режима файла и флагов доступа. Если файл уже существует, функция успешна, если exist_ok истинно (и время его модификации обновляется до текущего времени), иначе выдается сообщение FileExistsError.

Удалить этот файл или символическую ссылку. Если путь указывает на каталог, используйте Path.rmdir() вместо этого.

Если missing_ok равно false (по умолчанию), то при несуществовании пути выдается сообщение FileNotFoundError.

Если missing_ok равно true, исключения FileNotFoundError будут игнорироваться (такое же поведение, как у команды POSIX rm -f).

Изменено в версии 3.8: Был добавлен параметр missing_ok.

Path.write_bytes(data)

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

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

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

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

Существующий файл с таким же именем перезаписывается. Необязательные параметры имеют то же значение, что и в open().

Добавлено в версии 3.5.

Изменено в версии 3.10: Был добавлен параметр newline.

Соответствие инструментам в модуле os

Ниже приведена таблица, отображающая различные функции os на их соответствующие эквиваленты PurePath/Path.

Примечание

Не все приведенные ниже пары функций/методов эквивалентны. Некоторые из них, несмотря на совпадающие случаи использования, имеют разную семантику. К ним относятся os.path.abspath() и Path.resolve(), os.path.relpath() и PurePath.relative_to().

os и os.path.

pathlib

os.path.abspath()

Path.resolve() 1

os.chmod()

Path.chmod()

os.mkdir()

Path.mkdir()

os.makedirs()

Path.mkdir()

os.rename()

Path.rename()

os.replace()

Path.replace()

os.rmdir()

Path.rmdir()

os.remove(), os.unlink()

Path.unlink()

os.getcwd()

Path.cwd()

os.path.exists()

Path.exists()

os.path.expanduser()

Path.expanduser() и Path.home().

os.listdir()

Path.iterdir()

os.path.isdir()

Path.is_dir()

os.path.isfile()

Path.is_file()

os.path.islink()

Path.is_symlink()

os.link()

Path.hardlink_to()

os.symlink()

Path.symlink_to()

os.readlink()

Path.readlink()

os.path.relpath()

PurePath.relative_to() 2

os.stat()

Path.stat(), Path.owner(), Path.group()

os.path.isabs()

PurePath.is_absolute()

os.path.join()

PurePath.joinpath()

os.path.basename()

PurePath.name

os.path.dirname()

PurePath.parent

os.path.samefile()

Path.samefile()

os.path.splitext()

PurePath.stem и PurePath.suffix.

Сноски

1

os.path.abspath() не разрешает символические ссылки, в то время как Path.resolve() разрешает.

2

PurePath.relative_to() требует, чтобы self был подпунктом аргумента, а os.path.relpath() - нет.

Вернуться на верх