Документация Python неофициальный перевод

os.path – Типовые операции с именами путейos.path – Common pathname manipulations

Исходный код: Lib/genericpath.py, Lib/posixpath.py (для POSIX) и Lib/ntpath.py (для Windows).


Этот модуль реализует несколько полезных функций для работы с именами путей. Для чтения или записи файлов обратитесь к open(), а для доступа к файловой системе – к модулю os. Параметры пути могут быть переданы в виде строк, байт или любого объекта, реализующего протокол os.PathLike.

В отличие от оболочки Unix, Python не выполняет автоматического раскрытия путей. Функции, такие как expanduser() и expandvars(), можно вызывать явно, когда приложению требуется раскрытие пути в стиле оболочки. (См. также модуль glob.)

См. также

Модуль pathlib предоставляет высокоуровневые объекты путей.

Примечание

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

Примечание

Поскольку в разных операционных системах разные соглашения об именах путей, в стандартной библиотеке есть несколько версий этого модуля. Модуль os.path всегда представляет собой модуль путей, подходящий для операционной системы, на которой выполняется Python, и поэтому пригоден для локальных путей. Однако вы также можете импортировать и использовать отдельные модули, если хотите работать с путём, который всегда находится в одном из этих форматов. Все они имеют одинаковый интерфейс:

  • posixpath для путей в стиле UNIX

  • ntpath для путей Windows

Изменено в версии 3.8: exists(), lexists(), isdir(), isfile(), islink() и ismount() теперь возвращают False вместо возбуждения исключения для путей, содержащих символы или байты, непредставимые на уровне ОС.

os.path.abspath(path)

Возвращает нормализованную абсолютную версию пути path. На большинстве платформ это эквивалентно вызову normpath(join(os.getcwd(), path)).

См. также

os.path.join() и os.path.normpath().

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.basename(path, /)

Возвращает базовое имя пути path. Это второй элемент пары, возвращаемой при передаче path функции split(). Обратите внимание, что результат этой функции отличается от программы Unix basename; если basename для '/foo/bar/' возвращает 'bar', то функция basename() возвращает пустую строку ('').

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.commonpath(paths)

Возвращает самый длинный общий подпуть для каждого пути в итерируемом объекте paths. Возбуждает ValueError, если paths содержат как абсолютные, так и относительные пути, если paths находятся на разных дисках или если paths пуст. В отличие от commonprefix(), эта функция возвращает корректный путь.

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

Изменено в версии 3.6: Принимает последовательность объектов, подобных путям.

Изменено в версии 3.13: Теперь можно передавать любой итерируемый объект, а не только последовательности.

os.path.commonprefix(list, /)

Возвращает самый длинный строковый префикс (символ за символом), который является префиксом всех строк в list. Если list пуст, возвращается пустая строка ('').

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

Эта функция может возвращать недопустимые пути, так как работает посимвольно. Если нужен общий префикс пути, то алгоритм, реализованный в этой функции, не является надёжным. Используйте commonpath() для поиска общего префикса пути.

>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'

>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.dirname(path, /)

Возвращает имя каталога пути path. Это первый элемент пары, возвращаемой при передаче path функции split().

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.exists(path)

Возвращает True, если path указывает на существующий путь или открытый файловый дескриптор. Возвращает False для битых символических ссылок. На некоторых платформах эта функция может вернуть False, если нет разрешения на выполнение os.stat() для запрошенного файла, даже если path физически существует.

Изменено в версии 3.3: path теперь может быть целым числом: возвращается True, если это открытый файловый дескриптор, и False в противном случае.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.lexists(path)

Возвращает True, если path указывает на существующий путь, включая битые символические ссылки. Эквивалентно exists() на платформах, где нет os.lstat().

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.expanduser(path)

В Unix и Windows возвращает аргумент, в котором начальный компонент ~ или ~user заменён на домашний каталог этого пользователя.

В Unix начальный ~ заменяется на значение переменной окружения HOME, если она установлена; в противном случае домашний каталог текущего пользователя ищется в базе паролей через встроенный модуль pwd. Начальный ~user ищется напрямую в базе паролей.

В Windows будет использоваться USERPROFILE, если он установлен; в противном случае будет использоваться комбинация HOMEPATH и HOMEDRIVE. Начальный ~user обрабатывается путём проверки, совпадает ли последний компонент каталога домашнего каталога текущего пользователя с USERNAME, и замены его при совпадении.

Если разворачивание не удалось или путь не начинается с тильды, путь возвращается без изменений.

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.8: Больше не использует HOME в Windows.

os.path.expandvars(path)

Возвращает аргумент с развёрнутыми переменными окружения. Подстроки вида $name или ${name} заменяются значением переменной окружения name. Некорректные имена переменных и ссылки на несуществующие переменные остаются без изменений.

В Windows поддерживаются расширения %name% в дополнение к $name и ${name}.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getatime(path, /)

Возвращает время последнего доступа к path. Возвращаемое значение – число с плавающей запятой, количество секунд с начала эпохи (см. модуль time). Возбуждает OSError, если файл не существует или недоступен.

os.path.getmtime(path, /)

Возвращает время последнего изменения path. Возвращаемое значение – число с плавающей запятой, количество секунд с начала эпохи (см. модуль time). Возбуждает OSError, если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getctime(path, /)

Возвращает системное ctime, которое в одних системах (например, Unix) является временем последнего изменения метаданных, а в других (например, Windows) – временем создания для path. Возвращаемое значение – число секунд с начала эпохи (см. модуль time). Возбуждает OSError, если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getsize(path, /)

Возвращает размер в байтах path. Возбуждает OSError, если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isabs(path, /)

Возвращает True, если path является абсолютным путём. В Unix это означает, что путь начинается с косой черты, в Windows – что он начинается с двух обратных косых черт или с буквы диска, двоеточия и обратной косой черты вместе.

См. также

abspath()

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.13: В Windows возвращает False, если указанный путь начинается ровно с одной (обратной) косой черты.

os.path.isfile(path)

Возвращает True, если path является existing обычным файлом. Функция следует по символическим ссылкам, поэтому и islink(), и isfile() могут быть истинны для одного и того же пути.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isdir(path, /)

Возвращает True, если path является existing каталогом. Функция следует по символическим ссылкам, поэтому и islink(), и isdir() могут быть истинны для одного и того же пути.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isjunction(path)

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

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

Возвращает True, если path ссылается на existing запись каталога, являющуюся символической ссылкой. Всегда False, если символические ссылки не поддерживаются средой выполнения Python.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.ismount(path)

Возвращает True, если имя пути path является точкой монтирования: точкой в файловой системе, куда примонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский каталог path, path/.., на другом устройстве, чем path, или указывают ли path/.. и path на один и тот же индексный дескриптор на одном устройстве – это позволяет обнаруживать точки монтирования для всех вариантов Unix и POSIX. Она не может надёжно обнаруживать bind-монтирования в одной файловой системе. В системах Linux она всегда возвращает True для подтомов btrfs, даже если они не являются точками монтирования. В Windows корневой каталог буквы диска и общая папка UNC всегда являются точками монтирования, а для любого другого пути вызывается GetVolumePathName, чтобы проверить, отличается ли он от входного пути.

Изменено в версии 3.4: Добавлена поддержка обнаружения не корневых точек монтирования в Windows.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isdevdrive(path)

Возвращает True, если имя пути path находится на диске разработчика Windows (Dev Drive). Диск разработчика оптимизирован для сценариев разработки и обеспечивает более высокую производительность при чтении и записи файлов. Рекомендуется для исходного кода, временных каталогов сборки, кешей пакетов и других операций с интенсивным вводом-выводом.

Может вызывать ошибку для недопустимого пути, например, без распознаваемого диска, но возвращает False на платформах, не поддерживающих диски разработчика. См. документацию Windows для получения информации о включении и создании дисков разработчика.

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

Изменено в версии 3.13: Теперь функция доступна на всех платформах и всегда будет возвращать False на тех, которые не поддерживают диски разработчика.

os.path.isreserved(path)

Возвращает True, если path является зарезервированным именем пути на текущей системе.

В Windows зарезервированные имена файлов включают те, что заканчиваются пробелом или точкой; содержат двоеточия (например, файловые потоки данных вида “name:stream”), символы подстановки (т.е. '*?"<>'), символ вертикальной черты или управляющие символы ASCII; а также имена DOS-устройств, такие как “NUL”, “CON”, “CONIN$”, “CONOUT$”, “AUX”, “PRN”, “COM1” и “LPT1”.

Примечание

Эта функция приблизительно реализует правила для зарезервированных путей в большинстве систем Windows. Эти правила меняются со временем в различных выпусках Windows. Функция может быть обновлена в будущих версиях Python по мере широкого распространения изменений в правилах.

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

os.path.join(path, /, *paths)

Умно объединяет один или несколько сегментов пути. Возвращаемое значение – это конкатенация path и всех элементов *paths, с ровно одним разделителем каталогов после каждой непустой части, кроме последней. То есть результат будет заканчиваться разделителем только в том случае, если последняя часть пуста или сама заканчивается разделителем.

Если сегмент является абсолютным путём (что в Windows требует указания и диска, и корневого каталога), то все предыдущие сегменты игнорируются, и объединение продолжается с этого абсолютного сегмента. Например, в Linux:

>>> os.path.join('/home/foo', 'bar')
'/home/foo/bar'
>>> os.path.join('/home/foo', '/home/bar')
'/home/bar'

В Windows диск не сбрасывается при обнаружении сегмента с корневым каталогом (например, r'\foo'). Если сегмент находится на другом диске или является абсолютным путём, все предыдущие сегменты игнорируются, а диск сбрасывается. Например:

>>> os.path.join('c:\\', 'foo')
'c:\\foo'
>>> os.path.join('c:\\foo', 'd:\\bar')
'd:\\bar'

Обратите внимание, что поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталога на диске C: (c:foo), а не c:\foo.

Изменено в версии 3.6: Теперь принимает объект, подобный пути для path и paths.

os.path.normcase(path, /)

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

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.normpath(path)

Нормализует имя пути, удаляя лишние разделители и ссылки на родительский каталог, так что A//B, A/B/, A/./B и A/foo/../B все превращаются в A/B. Эта строковая операция может изменить значение пути, содержащего символические ссылки. В Windows преобразует прямые косые черты в обратные. Для нормализации регистра используйте normcase().

Примечание

В системах POSIX, в соответствии с IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution, если имя пути начинается ровно с двух косых черт, первый компонент после начальных символов может интерпретироваться способом, определяемым реализацией, хотя более двух начальных символов должны рассматриваться как один символ.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.realpath(path, /, *, strict=False)

Возвращает канонический путь указанного имени файла, устраняя все символические ссылки, встречающиеся в пути (если они поддерживаются операционной системой). В Windows эта функция также разрешает имена в стиле MS-DOS (также называемые 8.3), такие как C:\\PROGRA~1, в C:\\Program Files.

По умолчанию путь вычисляется до первого компонента, который не существует, является циклом символических ссылок или при вычислении которого возникает OSError. Все такие компоненты добавляются без изменений к существующей части пути.

Некоторые ошибки, обрабатываемые таким образом, включают «в доступе отказано», «не каталог» или «неверный аргумент внутренней функции». Таким образом, результирующий путь может отсутствовать или быть недоступным, все еще содержать ссылки или циклы, а также проходить через не-каталоги.

Это поведение можно изменить с помощью именованных аргументов:

Если strict равен True, первая ошибка, возникшая при вычислении пути, возбуждается повторно. В частности, FileNotFoundError возбуждается, если path не существует, или другое OSError, если он по другой причине недоступен.

Если strict равен os.path.ALLOW_MISSING, ошибки, отличные от FileNotFoundError, возбуждаются повторно (как и в случае с strict=True). Таким образом, возвращаемый путь не будет содержать символических ссылок, но указанный файл и некоторые из его родительских каталогов могут отсутствовать.

Примечание

Эта функция эмулирует процедуру операционной системы по приведению пути к каноническому виду, которая немного отличается в Windows и UNIX в отношении того, как взаимодействуют ссылки и последующие компоненты пути.

API операционной системы приводят пути к каноническому виду по мере необходимости, так что обычно нет необходимости вызывать эту функцию.

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.8: Символические ссылки и точки соединения теперь разрешаются в Windows.

Изменено в версии 3.10: Добавлен параметр strict.

Изменено в версии 3.14: Добавлено значение ALLOW_MISSING для параметра strict.

os.path.ALLOW_MISSING

Специальное значение, используемое для аргумента strict в realpath().

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

os.path.relpath(path, start=os.curdir)

Возвращает относительный путь к path либо от текущего каталога, либо от указанного start каталога. Это вычисление пути: файловая система не опрашивается для подтверждения существования или природы path или start. В Windows ValueError возбуждается, когда path и start находятся на разных дисках.

start по умолчанию равен os.curdir.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.samefile(path1, path2, /)

Возвращает True, если оба указанных пути ссылаются на один и тот же файл или каталог. Это определяется по номеру устройства и номеру индексного дескриптора; возбуждается исключение, если вызов os.stat() для любого из путей завершается ошибкой.

Изменено в версии 3.2: Добавлена поддержка Windows.

Изменено в версии 3.4: Теперь в Windows используется та же реализация, что и на всех остальных платформах.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.sameopenfile(fp1, fp2)

Возвращает True, если файловые дескрипторы fp1 и fp2 ссылаются на один и тот же файл.

Изменено в версии 3.2: Добавлена поддержка Windows.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.samestat(stat1, stat2, /)

Возвращает True, если кортежи stat stat1 и stat2 ссылаются на один и тот же файл. Эти структуры могли быть возвращены os.fstat(), os.lstat() или os.stat(). Эта функция реализует сравнение, лежащее в основе samefile() и sameopenfile().

Изменено в версии 3.4: Добавлена поддержка Windows.

os.path.split(path, /)

Разделяет путь path на пару (head, tail), где tail – последний компонент пути, а head – всё, что ему предшествует. Часть tail никогда не содержит косой черты; если path заканчивается косой чертой, tail будет пустым. Если в path нет косых черт, head будет пустым. Если path пуст, то и head, и tail пусты. Конечные косые черты удаляются из head, если только это не корневой каталог (одна или несколько косых черт). В любом случае join(head, tail) возвращает путь к тому же расположению, что и path (но строки могут различаться). См. также функции join(), dirname() и basename().

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.splitdrive(path, /)

Разделяет путь path на пару (drive, tail), где drive – либо точка монтирования, либо пустая строка. В системах, не использующих спецификации дисков, drive всегда будет пустой строкой. В любом случае drive + tail будет тем же, что и path.

В Windows разделяет путь на диск/UNC-ресурс и относительный путь.

Если путь содержит букву диска, drive будет содержать всё вплоть до двоеточия включительно:

>>> splitdrive("c:/dir")
("c:", "/dir")

Если путь содержит UNC-путь, drive будет содержать имя узла и общую папку:

>>> splitdrive("//host/computer/dir")
("//host/computer", "/dir")

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.splitroot(path, /)

Разделяет путь path на кортеж из трёх элементов (drive, root, tail), где drive – имя устройства или точка монтирования, root – строка разделителей после устройства, а tail – всё, что после корня. Любой из этих элементов может быть пустой строкой. В любом случае drive + root + tail будет таким же, как path.

В системах POSIX drive всегда пуст. root может быть пустым (если path относительный), одной косой чертой (если path абсолютный) или двумя косыми чертами (определяется реализацией согласно IEEE Std 1003.1-2017; 4.13 Разрешение пути). Например:

>>> splitroot('/home/sam')
('', '/', 'home/sam')
>>> splitroot('//home/sam')
('', '//', 'home/sam')
>>> splitroot('///home/sam')
('', '/', '//home/sam')

В Windows drive может быть пустым, буквой диска, UNC-ресурсом или именем устройства. root может быть пустым, прямой косой чертой или обратной косой чертой. Например:

>>> splitroot('C:/Users/Sam')
('C:', '/', 'Users/Sam')
>>> splitroot('//Server/Share/Users/Sam')
('//Server/Share', '/', 'Users/Sam')

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

os.path.splitext(path, /)

Разделяет путь path на пару (root, ext), такую что root + ext == path, а расширение ext пусто или начинается с точки и содержит не более одной точки.

Если путь не содержит расширения, ext будет '':

>>> splitext('bar')
('bar', '')

Если путь содержит расширение, то ext будет установлен в это расширение, включая начальную точку. Обратите внимание, что предыдущие точки игнорируются:

>>> splitext('foo.bar.exe')
('foo.bar', '.exe')
>>> splitext('/foo/bar.exe')
('/foo/bar', '.exe')

Начальные точки последнего компонента пути считаются частью корня:

>>> splitext('.cshrc')
('.cshrc', '')
>>> splitext('/foo/....jpg')
('/foo/....jpg', '')

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.supports_unicode_filenames

True, если произвольные строки Unicode могут использоваться в качестве имён файлов (с учётом ограничений, накладываемых файловой системой).