os.path — Общие манипуляции с путями к файлам и каталогам¶
Модуль реализует некоторые полезные функции для имён путей. Для чтения или записи файлов см. open() , а для доступа к файловой системе см. модуль os . Параметры пути могут передаваться в виде строк или байтов. Приложениям рекомендуется представлять имена файлов в виде Юникод строк. К сожалению, некоторые имена файлов не могут быть представлены в виде строк в Unix, поэтому приложения, которым необходимо поддерживать произвольные имена файлов в Unix, должны использовать байтовые объекты для представления имён путей. И наоборот, использование байтовых объектов не может представлять все имена файлов в Windows (в стандартной кодировке mbcs ), поэтому приложения Windows должны использовать строковые объекты для доступа ко всем файлам.
В отличие от оболочки Unix, Python не выполняет никаких автоматических расширений пути. Такие функции, как expanduser() и expandvars() , могут вызваться явно, когда приложению требуется расширение пути, подобное оболочке. (См. также модуль glob .)
Модуль pathlib предлагает высокоуровневые объекты пути.
Все функции принимают в качестве параметров только байты или только строковые объекты. Результатом будет объект того же типа, если возвращается путь или имя файла.
Поскольку у разных операционных систем разные соглашения об именах путей, в стандартной библиотеке есть несколько версий данного модуля. Модуль os.path всегда является модулем пути, подходящим для операционной системы, в которой работает Python, и, следовательно, может использоваться для локальных путей. Однако вы также можете импортировать и использовать отдельные модули, если хотите управлять путём, который всегда является в одном из различных форматов. У следующих модулей одинаковый интерфейс:
- posixpath для путей в стиле UNIX
- ntpath для путей Windows
Изменено в версии 3.8: exists() , lexists() , isdir() , isfile() , islink() и ismount() теперь возвращают False вместо того, чтобы вызывать исключение для путей, содержащих символы или байты, непредставимые на уровне ОС.
Возвращает нормализованную абсолютизированную версию пути path. На большинстве платформ эквивалентно вызову функции normpath() следующим образом: normpath(join(os.getcwd(), path)) .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает базовое имя пути path. Второй элемент пары, возвращаемой при передаче path функции split() . Обратите внимание, что результат этой функции отличается от результата программы Unix basename; где basename для ‘/foo/bar/’ возвращает ‘bar’ , функция basename() возвращает пустую строку ( » ).
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает самый длинный общий подпуть каждого пути в последовательности paths. Вызывает ValueError , если paths содержит как абсолютные, так и относительные пути, paths находится на разных дисках или если paths пуст. В отличие от commonprefix() , возвращает действительный путь.
Добавлено в версии 3.5.
Изменено в версии 3.6: Принимает последовательность путеподобных объектов .
Возвращает префикс самого длинного пути (посимвольно), который является префиксом всех путей в list. Если list пуст, возвращает пустую строку ( » ).
Функция может возвращать недопустимые пути, потому что работает по символу за раз. Чтобы получить действительный путь, см. commonpath() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает имя каталога пути path. Первый элемент пары, возвращаемой при передаче path функции split() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path относится к существующему пути или дескриптору открытого файла. Возвращает False для неработающих символических ссылок. На некоторых платформах функция может возвращать False , если не предоставлено разрешение на выполнение os.stat() в запрошенном файле, даже если path физически существует.
Изменено в версии 3.3: path теперь может быть целым числом: возвращается True , если дескриптор открытого файла, в противном случае — False .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path относится к существующему пути. Возвращает True для неработающих символических ссылок. Эквивалентен exists() на платформах без os.lstat() .
Изменено в версии 3.6: Принимает путеподобный объект .
В Unix и Windows вернуть аргумент, заменив начальный компонент
user на домашний каталог данного user.
В Unix начальный
заменяется переменной среды HOME , если она установлена; в противном случае домашний каталог текущего пользователя ищется в каталоге паролей с помощью встроенного модуля pwd . Начальный
user ищется непосредственно в каталоге паролей.
В Windows будет использоваться USERPROFILE , если он установлен, в противном случае будет использоваться комбинация HOMEPATH и HOMEDRIVE . Первоначальный
user обрабатывается путём удаления последнего компонента каталога из созданного пути пользователя, полученного выше.
Если раскрытие не удаётся или путь не начинается с тильды, путь возвращается без изменений.
Изменено в версии 3.6: Принимает путеподобный объект .
Изменено в версии 3.8: Больше не использует HOME в Windows.
Возвращает аргумент с расширенными переменными среды. Подстроки вида $name или $
В Windows поддерживаются расширения %name% в дополнение к $name и $
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает время последнего доступа path. Возвращаемое значение — число с плавающей запятой, дающее количество секунд с начала эпохи (см. модуль time ). Вызывает OSError , если файл не существует или недоступен.
os.path. getmtime ( path ) ¶
Возвращает время последней модификации path. Возвращаемое значение — число с плавающей запятой, представляющее количество секунд с начала эпохи (см. модуль time ). Вызывает OSError , если файл не существует или недоступен.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает ctime системы, который в некоторых системах (например, Unix) является временем последнего изменения метаданных, а в других (например, Windows) — временем создания path. Возвращаемое значение — число, указывающее количество секунд с начала эпохи (см. модуль time ). Вызывает OSError , если файл не существует или недоступен.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает размер path в байтах. Вызывает OSError , если файл не существует или недоступен.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path — абсолютный путь. В Unix это означает, что он начинается с косой черты, в Windows — с косой черты (обратной) после удаления потенциальной буквы диска.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path является обычным файлом existing . Следует за символическими ссылками, поэтому и islink() , и isfile() могут быть верными для одного и того же пути.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path — каталог существует . Следует за символическими ссылками, поэтому и islink() , и isdir() могут быть верными для одного и того же пути.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если path относится к записи существующего каталога, которая является символической ссылкой. Всегда False , если символические ссылки не поддерживаются средой выполнения Python.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если путь path — точка монтирования: точка в файловой системе, где была смонтирована другая файловая система. В POSIX функция проверяет, находится ли родительский элемент path, path /.. , на другом устройстве, чем path, или же path /.. и path указывают на один и тот же i-node на том же устройстве, — должно определять точки монтирования для всех вариантов Unix и POSIX. Функция не может надежно обнаружить монтирование привязки в одной и той же файловой системе. В Windows корень с буквой диска и общий UNC-файл всегда являются точками монтирования, а для любого другого пути вызывается GetVolumePathName , чтобы узнать, отличается ли он от входного пути.
Добавлено в версии 3.4: Поддержка определения точек монтирования без полномочий root в Windows.
Изменено в версии 3.6: Принимает путеподобный объект .
Разумно соединить один или несколько компонентов пути. Возвращаемое значение представляет собой конкатенацию path и любых элементов *paths с ровно одним разделителем каталогов ( os.sep ), следующим за каждой непустой частью, кроме последней, что означает, что результат будет заканчиваться разделителем только в том случае, если последняя часть пуста. Если компонент является абсолютным путём, все предыдущие компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.
В Windows буква диска не сбрасывается при обнаружении компонента абсолютного пути (например, r’\foo’ ). Если компонент содержит букву диска, все предыдущие компоненты отбрасываются, а буква диска сбрасывается. Обратите внимание, что для каждого диска существует текущий каталог, os.path.join(«c:», «foo») представляет путь относительно текущего каталога на диске C: ( c:foo ), а не c:\foo .
Изменено в версии 3.6: Принимает путеподобный объект для path и paths.
Нормализовать регистр имени пути. В Windows преобразовать все символы в имени пути в нижний регистр, а также преобразовать косую черту в обратную косую черту. В других операционных системах возвращает путь без изменений.
Изменено в версии 3.6: Принимает путеподобный объект .
Нормализовать имя пути, свернув избыточные разделители и ссылки верхнего уровня, чтобы A//B , A/B/ , A/./B и A/foo/../B превратились в A/B . Манипуляция со строкой может изменить значение пути, содержащего символические ссылки. В Windows преобразует косую черту в обратную косую черту. Чтобы нормализовать регистр, используйте normcase() .
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает канонический путь указанного имени файла, исключив любые символические ссылки, встречающиеся в пути (если они поддерживаются операционной системой).
Когда происходят циклы символьных ссылок, возвращаемый путь будет одним из элементов цикла, но не даётся никаких гарантий относительно того, какой из них именно будет.
Изменено в версии 3.6: Принимает путеподобный объект .
Изменено в версии 3.8: Символические ссылки и переходы теперь разрешены в Windows.
Возвращает относительный путь к файлу path либо из текущего каталога, либо из необязательного каталога start. Это вычисление пути: у файловой системы нет доступа, чтобы подтвердить существование или характер path или start.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если оба аргумента имени пути относятся к одному и тому же файлу или каталогу. Определяется номером устройства и номером i-node и вызывает исключение в случае сбоя вызова os.stat() по любому имени пути.
Изменено в версии 3.2: Добавлена поддержка Windows.
Изменено в версии 3.4: Windows теперь использует ту же реализацию, что и все другие платформы.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если файловые дескрипторы fp1 и fp2 относятся к одному и тому же файлу.
Изменено в версии 3.2: Добавлена поддержка Windows.
Изменено в версии 3.6: Принимает путеподобный объект .
Возвращает True , если кортежи статистики stat1 и stat2 относятся к одному и тому же файлу. Структуры могут возвращаться os.fstat() , os.lstat() или os.stat() . Функция реализует базовое сравнение, используемое samefile() и sameopenfile() .
Изменено в версии 3.4: Добавлена поддержка Windows.
Изменено в версии 3.6: Принимает путеподобный объект .
Разделяет имя пути path на пару, (head, tail) , где tail — последний компонент имени пути, а head — всё, что ведёт к нему. Часть tail никогда не будет содержать косую черту; если path заканчивается косой чертой, tail будет пустым. Если в path нет косой черты, head будет пустым. Если path пусто, то и head, и tail пусты. Завершающие косые черты удаляются из head, если он не является корневым (только одна или несколько косых черт). Во всех случаях join(head, tail) возвращает путь к тому же местоположению, что и path (но строки могут отличаться). См. также функции dirname() и basename() .
Изменено в версии 3.6: Принимает путеподобный объект .
Разделяет путь path на пару (drive, tail) , где drive — либо точка монтирования, либо пустая строка. В системах, которые не используют спецификации дисков, drive всегда будет пустой строкой. Во всех случаях drive + tail будет таким же, как path.
В Windows разделяет имя пути на диск/UNC точку обмена и относительный путь.
Если путь содержит букву диска, диск будет содержать всё до двоеточия включительно. Например splitdrive(«c:/dir») возвращает («c:», «/dir»)
Если путь содержит путь UNC, диск будет содержать имя хоста и общий ресурс до четвертого разделителя, но не включая его. например splitdrive(«//host/computer/dir») возвращает («//host/computer», «/dir»)
Изменено в версии 3.6: Принимает путеподобный объект .
Разделяет путь path на пару (root, ext) так, чтобы root + ext == path и ext были пустыми или начинались с точки и содержали не более одной точки. Начальные точки в базовом имени игнорируются; splitext(‘.cshrc’) возвращает (‘.cshrc’, ») .
Изменено в версии 3.6: Принимает путеподобный объект .
True , если в качестве имён файлов могут использоваться произвольные Юникод строки (в пределах ограничений, накладываемых файловой системой).
Python Path
Summary: in this tutorial, you’ll learn how to use the Python Path class from the pathlib module to interact with the file system across platforms easily and effectively.
Introduction to the Python Path class
The pathlib is a built-in module that allows you to interact with the file system more effectively. In addition, the pathlib works accross operating systems including Windows, macOS and Linux.
The pathlib treats the paths as objects. So instead of using paths as strings, you use the Path class to manage paths.
To use the Path class from the pathlib module, you import it as follows:
Getting the path of the home directory
Since Path is a class, you can access its methods and properies. For example, you can get the path of the home directory by calling the home() static method like this:
On Windows, it returns something like:
On Linux, it returns the home directory of the current user:
…with an assumption that the root is the user on both Windows and Linux.
Getting the path of the current working directory
Similarly, you can call the cwd() static method to get the path of the current working directory:
Creating a Path object from a string
To create a Path object, you can pass a string to the Path() like this:
Getting the parent directory of a path
To get the first parent directory path of the current working directory by accessing the parent property like this:
To get the path of the n th parent directory, you can use the parents property:
Joining paths
To join paths, you use the / operator. For example, the get the path of the Downloads directory located inside the home directory, you can use the / operator as follows:
The / operator returns a new Path object. Therefore, you can use it multiple times in an expression. For example:
Checking if a path exists
A path can be a file or a directory, to check if a path exists, you can use the exists() method. For example:
The exists() method returns True if the path exists or False otherwise.
Resolving a path
To get the full path of a Path object, you use the resolve() method. For example:
Getting file name and extension
To get the file name of a path, you use the name property:
To get the file name without extension, you use the stem property:
To get the extension of the file, you use the suffix property:
Checking if a path is file or directory
The is_file() method returns True if a path is a file or False otherwise. Likewise, the is_dir() reuturns True if a path is a directory or False otherwse.
Using Python Path to interact with files
The Path objet allows you to create, rename, and delete files.
Creating a file
To create a file, you use the touch() method. For example, the following creates the readme.md file in the current working directory:
To write text to a file, you use the write_text() method:
Note that you can also create a binary file and write bytes to it using the write_bytes() method.
Deleting a file
To delete a file, you use the unlink() method:
If the path doesn’t exist, the unlink() method will raise a FileNotFoundError exception. To avoid this, you can use the missing_ok argument:
Renaming a file
To rename a file, you use the rename() method. The following example creates the notes.md file, write a text into it, and rename its name to notes.txt :
Listing files in a directory
The iterdir() method iterates over a directory. It returns a generator that yields the paths including both a path of a file or a directory.
To list all files in a directory, you can combine the iterdir() method with is_file() method. For example, the following lists all files in the downloads directory located inside the home directory:
If you want to get a particular file type, you can use the suffix property. For example, the following lists all text files from the downloads directory:
Or in a more pythonic way using a list comprehension:
Using Python Path to interact with directories
Like files, the Path also allows you to create, rename, and remove directories.
Creating a directory
To create a directory, you use the mkdir() method. The following example creates a test directory in the current working directory:
If the test directory exists, the mkdir() method will raise the FileExistsError exception. To avoid the exception if the directory already exists, you can use the exist_ok argument:
Renaming a directory
To rename a directory, you use the rename() method. For example, the following renames the directory test to tests (with additional s ):
Deleting a directory
To delete a directory, you use the rmdir() method. Note that the directory must be empty:
If the directory doesn’t exist, the rmdir() method will raise a FileNotFoundErorr exception. To avoid this, you can check if the directory exists before calling the rmdir() method:
Listing subdirectories
To list all subdirectories of a path, you use the iterdir() and is_dir() methods. For example, the following lists all subdirectories of the downloads path:
Python Path — Как использовать модуль Pathlib (с примерами)
В каждой операционной системе существуют свои правила построения путей к файлам. Например, в Linux для путей используются прямые слэши (“/”), а в Windows — обратные слэши (“\”).
Это незначительное отличие может создать проблемы, если вы занимаетесь проектом и хотите, чтобы другие разработчики, работающие в разных операционных системах, могли дополнить ваш код.
К счастью, если вы пишете на Python, то с этой задачей успешно справляется модуль Pathlib. Он обеспечит одинаковую работу ваших путей к файлам в разных операционных системах. Кроме того, он предоставляет функциональные возможности и операции, которые помогут вам сэкономить время при обработке и манипулировании путями.
Необходимые условия
Pathlib по умолчанию поставляется с Python >= 3.4. Однако, если вы используете версию Python ниже 3.4, у вас не будет доступа к этому модулю.
Как работает Pathlib?
Чтобы разобраться, как можно построить базовый путь с помощью Pathlib, давайте создадим новый файл Python example.py и поместим его в определенный каталог.
Откройте файл и введите следующее:
В данном примере мы импортируем модуль Pathlib. Затем создаем новую переменную p , чтобы сохранить путь. Здесь мы используем объект Path из Pathlib со встроенной в Python переменной под названием __file__ . Эта переменная служит ссылкой на путь к файлу, в котором мы ее прописываем, а именно, example.py .
Если мы выведем p , то получим путь к файлу, в котором сейчас находимся:
Выше показано, что Pathlib создает путь к этому файлу, помещая этот конкретный скрипт в объект Path. Pathlib содержит множество объектов, таких как PosixPath() и PurePath() , о которых мы узнаем больше в следующих разделах.
Pathlib делит пути файловой системы на два разных класса, которые представляют два типа объектов пути: Pure Path и Concrete Path.

Классы PurePath()
Pure path предоставляет утилиты для обработки пути к файлу и манипулирования им без совершения операций записи, в то время как Concrete path позволяет производить обработку пути к файлу и выполнять операции записи.
Другими словами, Concrete path — это подкласс Pure path. Он наследует манипуляции от родительского класса и добавляет операции ввода/вывода, которые выполняют системные вызовы.
Pure path в Python
Pure path управляет путем к файлу на вашей машине, даже если он принадлежит другой операционной системе.
Допустим, вы работаете в Linux и хотите использовать путь к файлу Windows. Здесь объекты класса Pure path помогут вам обеспечить работу пути на вашей машине с некоторыми базовыми операциями, такими как создание дочерних путей или доступ к отдельным частям пути.
Но Pure path не сможет имитировать некоторые другие операции, такие как создание каталога или файла, потому что вы не находитесь в этой операционной системе.
Как использовать Pure path
Как видно из приведенной выше диаграммы, Pure path состоит из трех классов, которые обрабатывают любой путь к файловой системе на вашем компьютере:
PurePath() — это корневой узел, который обеспечивает операции по обработке каждого объекта пути в Pathlib.
Когда вы инстанцируете PurePath() , он создает два класса для обработки путей Windows и других, отличных от Windows. PurePath() создает общий объект пути «agnostic path», независимо от операционной системы, в которой вы работаете.
PurePath() в приведенном выше примере создает PurePosixPath() , поскольку мы предположили, что работаем на машине Linux. Но если вы создадите его на Windows, то получите что-то вроде PureWindowsPath(‘setup.py’) .
PurePosixPath() — это дочерний узел PurePath(), реализованный для путей файловой системы, отличной от Windows.
Если вы инстанцируете PurePosixPath() в Windows, то не возникнет никакой ошибки, просто потому что этот класс не выполняет системных вызовов.
PureWindowsPath() — это дочерний узел PurePath() , реализованный для путей файловой системы Windows.
То же самое относится и к PureWindowsPath() , поскольку этот класс не предусматривает системных вызовов, следовательно, его инстанцирование не вызовет ошибок для других операционных систем.
Свойства Pure path
Каждый подкласс в PurePath() предоставляет следующие свойства:
PurePath().parent выводит родительский класс:
В примере выше мы используем свойство .parent , чтобы получить путь к логическому родителю main.py .
PurePath().parents[] выводит предков пути:
Вы всегда должны указывать индекс предка в квадратных скобках, как показано выше. В Python 3.10 и выше можно использовать срезы и отрицательные значения индекса.
PurePath().name предоставляет имя последнего компонента вашего пути:
В этом примере конечным компонентом пути является main.py . Таким образом, свойство .name выводит имя файла main.py , то есть main с суффиксом .py.
В свою очередь, PurePath().suffix предоставляет расширение файла последнего компонента вашего пути:
По сравнению со свойством .name , .suffix выводит расширение файла и исключает имя файла.
PurePath().stem выводит только имя конечного компонента вашего пути без суффикса:
Как видно выше, свойство .stem исключает суффикс конечного компонента main.p y и предоставляет только имя файла.
Методы Pure path
Каждый подкласс PurePath() предоставляет следующие методы:
PurePath().is_absolute() проверяет, является ли ваш путь абсолютным или нет:
Обратите внимание, что абсолютный путь состоит из корня и имени диска. В данном случае PurePath() не позволяет нам узнать имя диска.
Если вы используете PureWindowsPath() , то можете репрезентовать абсолютный путь, содержащий имя диска, как PureWindowsPath(‘c:/Program Files’) .
PurePath().is_relative() проверяет, принадлежит ли данный путь другому заданному пути или нет:
В данном примере заданный путь /src является частью или принадлежит пути p , в то время как другой заданный путь /data выдает False , поскольку он не имеет никакого отношения к пути p .
PurePath().joinpath() конкатенирует путь с заданными аргументами (дочерними путями):
Обратите внимание, что нет необходимости добавлять слэши в заданные аргументы, так как метод .joinpath() делает это за вас.
PurePath().match() проверяет, соответствует ли путь заданному шаблону:
Исходя из приведенных примеров, шаблон должен совпадать с путем. Если заданный шаблон является абсолютным, то и путь должен быть абсолютным.
PurePath().with_name() изменяет имя конечного компонента вместе с его суффиксом:
Метод .with_name() не изменяет имя последнего компонента навсегда. Кроме того, если указанный путь не содержит имени, возникает ошибка, как отмечено в официальной документации.
PurePath().with_stem() изменяет только имя последнего компонента пути:
Это аналогично методу .with_name() . Метод .with_stem() изменяет имя последнего компонента на время. Также, если указанный путь не содержит имени, произойдет ошибка.
PurePath().with_suffix() временно изменяет суффикс или расширение последнего компонента пути:
Если имя заданного пути не содержит суффикса, метод .with_suffix() добавляет суффикс за вас:
Но если мы не включим суффикс и оставим аргумент пустым ‘ ‘ , текущий суффикс будет удален.
Некоторые методы, такие как .with_stem() и .is_relative_to() , были недавно добавлены в Python 3.9 и выше. Поэтому, если вы их вызываете, используя Python 3.8 или ниже, будет выдана ошибка атрибута.
Concrete Path в Python
Concrete Paths позволяет обрабатывать, манипулировать и выполнять операции записи над различными путями файловой системы.
Другими словами, этот тип объекта пути помогает нам создать, скажем, новый файл, новый каталог и выполнить другие операции ввода/вывода, не находясь в данной операционной системе.
Как использовать Concrete path
В Concrete path обрабатываются любые пути файловой системы и выполняются системные вызовы на вашем компьютере. Эти объекты пути являются дочерними путями Pure path и состоят из трех подклассов, как и сами Pure path:
Path() — это дочерний узел PurePath() , он обеспечивает операции обработки с возможностью выполнения процесса записи.
Когда вы инстанцируете Path() , он создает два класса для работы с путями Windows и отличных от Windows. Как и PurePath() , Path() также создает общий объект пути «agnostic path», независимо от операционной системы, в которой вы работаете.
Path() в приведенном выше примере создает PosixPath() , поскольку мы предполагаем, что работаем на Linux. Но если вы создадите его в Windows, то получите что-то вроде WindowsPath(‘setup.py’) .
PosixPath() — это дочерний узел Path() и PurePosixPath() , реализованный для обработки и управления путями файловой системы, отличной от Windows.
Вы получите ошибку при инстанцировании PosixPath() на компьютере с Windows, поскольку нельзя выполнять системные вызовы во время работы в другой операционной системе.
WindowsPath() — это дочерний узел Path() и PureWindowsPath() , реализованный для путей файловой системы Windows.
То же самое относится и к WindowsPath() , поскольку вы работаете в другой операционной системе — поэтому ее инстанцирование приведет к ошибке.
Свойства Concrete path
Поскольку Concrete path является подклассом Pure path, вы можете делать с Concrete path все, что угодно, используя свойства PurePath() . Это означает, что мы можем использовать, например, свойство .with_suffix для добавления суффикса к Concrete path:
Или вы можете проверить, относится ли данный путь к исходному пути с помощью .is_relative_to :
Всегда помните, что Concrete path наследуют операции обработки от Pure path и добавляют операции записи, которые выполняют системные вызовы и конфигурации ввода/вывода.
Методы Concrete path
Каждый подкласс Path() предоставляет следующие методы для обработки путей и выполнения системных вызовов:
Path().iterdir() возвращает содержимое каталога. Допустим, у нас есть следующая папка, содержащая следующие файлы:
Чтобы вернуть содержимое каталога /data , вы можете использовать метод .iterdir() :
Метод .itertir() создает итератор, который случайным образом перечисляет файлы.
Path().exists() проверяет, существует ли файл/каталог в текущем пути. Давайте воспользуемся каталогом из предыдущего примера (наш текущий каталог — /data ):
Метод .exists() возвращает True , если заданный файл существует в каталоге data . Метод возвращает False , если его нет.
То же самое относится и к каталогам, метод возвращает True , если заданный каталог существует, и False , если каталог отсутствует.
Path().mkdir() создает новый каталог по заданному пути:
Согласно официальной документации, метод .mkdir() принимает три аргумента. В данный момент мы сосредоточимся только на аргументах parents и exist_ok .
По умолчанию оба аргумента имеют значение False . Аргумент parents выдает ошибку FileNotFound в случае отсутствия родителя, а exist_ok выдает ошибку FileExists, если данный каталог уже существует.
В приведенном примере вы можете установить аргументы в True , чтобы игнорировать упомянутые ошибки и обновить каталог.
Мы также можем создать новый файл по указанному пути с помощью метода Path().touch() :
Та же логика применима к методу .touch() . Здесь параметр exist_ok может быть установлен в True , чтобы игнорировать ошибку FileExists и обновить файл.
Path().rename() переименовывает файл/каталог по заданному пути. Рассмотрим пример на примере нашего каталога /data :
Если вы присваиваете методу несуществующий файл, он выдает ошибку FileNotFound. То же самое относится и к каталогам.
Path().read_text() возвращает содержимое файла в формате строки:
Также вы можете использовать метод write_text() для записи содержимого в файл:
Обратите внимание, что метод .write_text() был добавлен в Python 3.5 и недавно был обновлен в Python 3.10, получив некоторые дополнительные параметры.
Важное замечание
Вы можете спросить себя, зачем использовать пути файловой системы Windows — ведь каждый пакет должен быть совместим и с другими операционными системами, а не только с Windows.
Вы правы, если цель состоит в том, чтобы сделать путь, не зависящий от ОС. Но иногда мы не можем этого сделать из-за некоторых параметров, уникальных для Windows или Posix систем. Вот почему предоставляются данные объекты — чтобы помочь разработчикам справиться с такими вариантами использования.
Некоторые пакеты нацелены на решение проблем, присутствующих только в экосистеме Windows, и Python поддерживает эти юзкейсы в данной библиотеке.
Что дальше?
Надеемся, это руководство помогло вам узнать, как и зачем использовать Pathlib и в чем его польза для обработки и манипулирования путями файловой системы.
Было бы здорово обыграть полученные знания и воплотить их в реальном проекте.
В этой статье я рассказал об основах, необходимых для использования Pathlib в вашем проекте.
В официальной документации описано больше методов и свойств, которые вы можете применить к путям файловой системы: Pathlib — Объектно-ориентированные пути файловой системы
Всех желающих приглашаем на открытое занятие, на котором научимся работать со встроенными модулями. Узнаем про модули (os, pathlib, functools). Регистрация открыта по ссылке.
os.path — Common pathname manipulations¶
Source code: Lib/posixpath.py (for POSIX) and Lib/ntpath.py (for Windows).
This module implements some useful functions on pathnames. To read or write files see open() , and for accessing the filesystem see the os module. The path parameters can be passed as strings, or bytes, or any object implementing the os.PathLike protocol.
Unlike a Unix shell, Python does not do any automatic path expansions. Functions such as expanduser() and expandvars() can be invoked explicitly when an application desires shell-like path expansion. (See also the glob module.)
The pathlib module offers high-level path objects.
All of these functions accept either only bytes or only string objects as their parameters. The result is an object of the same type, if a path or file name is returned.
Since different operating systems have different path name conventions, there are several versions of this module in the standard library. The os.path module is always the path module suitable for the operating system Python is running on, and therefore usable for local paths. However, you can also import and use the individual modules if you want to manipulate a path that is always in one of the different formats. They all have the same interface:
posixpath for UNIX-style paths
ntpath for Windows paths
Changed in version 3.8: exists() , lexists() , isdir() , isfile() , islink() , and ismount() now return False instead of raising an exception for paths that contain characters or bytes unrepresentable at the OS level.
Return a normalized absolutized version of the pathname path. On most platforms, this is equivalent to calling the function normpath() as follows: normpath(join(os.getcwd(), path)) .
Changed in version 3.6: Accepts a path-like object .
Return the base name of pathname path. This is the second element of the pair returned by passing path to the function split() . Note that the result of this function is different from the Unix basename program; where basename for ‘/foo/bar/’ returns ‘bar’ , the basename() function returns an empty string ( » ).
Changed in version 3.6: Accepts a path-like object .
Return the longest common sub-path of each pathname in the sequence paths. Raise ValueError if paths contain both absolute and relative pathnames, the paths are on the different drives or if paths is empty. Unlike commonprefix() , this returns a valid path.
New in version 3.5.
Changed in version 3.6: Accepts a sequence of path-like objects .
Return the longest path prefix (taken character-by-character) that is a prefix of all paths in list. If list is empty, return the empty string ( » ).
This function may return invalid paths because it works a character at a time. To obtain a valid path, see commonpath() .
Changed in version 3.6: Accepts a path-like object .
Return the directory name of pathname path. This is the first element of the pair returned by passing path to the function split() .
Changed in version 3.6: Accepts a path-like object .
Return True if path refers to an existing path or an open file descriptor. Returns False for broken symbolic links. On some platforms, this function may return False if permission is not granted to execute os.stat() on the requested file, even if the path physically exists.
Changed in version 3.3: path can now be an integer: True is returned if it is an open file descriptor, False otherwise.
Changed in version 3.6: Accepts a path-like object .
Return True if path refers to an existing path. Returns True for broken symbolic links. Equivalent to exists() on platforms lacking os.lstat() .
Changed in version 3.6: Accepts a path-like object .
On Unix and Windows, return the argument with an initial component of
user replaced by that user’s home directory.
On Unix, an initial
is replaced by the environment variable HOME if it is set; otherwise the current user’s home directory is looked up in the password directory through the built-in module pwd . An initial
user is looked up directly in the password directory.
On Windows, USERPROFILE will be used if set, otherwise a combination of HOMEPATH and HOMEDRIVE will be used. An initial
user is handled by checking that the last directory component of the current user’s home directory matches USERNAME , and replacing it if so.
If the expansion fails or if the path does not begin with a tilde, the path is returned unchanged.
Changed in version 3.6: Accepts a path-like object .
Changed in version 3.8: No longer uses HOME on Windows.
Return the argument with environment variables expanded. Substrings of the form $name or $
On Windows, %name% expansions are supported in addition to $name and $
Changed in version 3.6: Accepts a path-like object .
Return the time of last access of path. The return value is a floating point number giving the number of seconds since the epoch (see the time module). Raise OSError if the file does not exist or is inaccessible.
os.path. getmtime ( path ) ¶
Return the time of last modification of path. The return value is a floating point number giving the number of seconds since the epoch (see the time module). Raise OSError if the file does not exist or is inaccessible.
Changed in version 3.6: Accepts a path-like object .
Return the system’s ctime which, on some systems (like Unix) is the time of the last metadata change, and, on others (like Windows), is the creation time for path. The return value is a number giving the number of seconds since the epoch (see the time module). Raise OSError if the file does not exist or is inaccessible.
Changed in version 3.6: Accepts a path-like object .
Return the size, in bytes, of path. Raise OSError if the file does not exist or is inaccessible.
Changed in version 3.6: Accepts a path-like object .
Return True if path is an absolute pathname. On Unix, that means it begins with a slash, on Windows that it begins with a (back)slash after chopping off a potential drive letter.
Changed in version 3.6: Accepts a path-like object .
Return True if path is an existing regular file. This follows symbolic links, so both islink() and isfile() can be true for the same path.
Changed in version 3.6: Accepts a path-like object .
Return True if path is an existing directory. This follows symbolic links, so both islink() and isdir() can be true for the same path.
Changed in version 3.6: Accepts a path-like object .
Return True if path refers to an existing directory entry that is a symbolic link. Always False if symbolic links are not supported by the Python runtime.
Changed in version 3.6: Accepts a path-like object .
Return True if pathname path is a mount point: a point in a file system where a different file system has been mounted. On POSIX, the function checks whether path’s parent, path /.. , is on a different device than path, or whether path /.. and path point to the same i-node on the same device — this should detect mount points for all Unix and POSIX variants. It is not able to reliably detect bind mounts on the same filesystem. On Windows, a drive letter root and a share UNC are always mount points, and for any other path GetVolumePathName is called to see if it is different from the input path.
New in version 3.4: Support for detecting non-root mount points on Windows.
Changed in version 3.6: Accepts a path-like object .
Join one or more path segments intelligently. The return value is the concatenation of path and all members of *paths, with exactly one directory separator following each non-empty part, except the last. That is, the result will only end in a separator if the last part is either empty or ends in a separator. If a segment is an absolute path (which on Windows requires both a drive and a root), then all previous segments are ignored and joining continues from the absolute path segment.
On Windows, the drive is not reset when a rooted path segment (e.g., r’\foo’ ) is encountered. If a segment is on a different drive or is an absolute path, all previous segments are ignored and the drive is reset. Note that since there is a current directory for each drive, os.path.join("c:", "foo") represents a path relative to the current directory on drive C: ( c:foo ), not c:\foo .
Changed in version 3.6: Accepts a path-like object for path and paths.
Normalize the case of a pathname. On Windows, convert all characters in the pathname to lowercase, and also convert forward slashes to backward slashes. On other operating systems, return the path unchanged.
Changed in version 3.6: Accepts a path-like object .
Normalize a pathname by collapsing redundant separators and up-level references so that A//B , A/B/ , A/./B and A/foo/../B all become A/B . This string manipulation may change the meaning of a path that contains symbolic links. On Windows, it converts forward slashes to backward slashes. To normalize case, use normcase() .
On POSIX systems, in accordance with IEEE Std 1003.1 2013 Edition; 4.13 Pathname Resolution, if a pathname begins with exactly two slashes, the first component following the leading characters may be interpreted in an implementation-defined manner, although more than two leading characters shall be treated as a single character.
Changed in version 3.6: Accepts a path-like object .
Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path (if they are supported by the operating system).
If a path doesn’t exist or a symlink loop is encountered, and strict is True , OSError is raised. If strict is False , the path is resolved as far as possible and any remainder is appended without checking whether it exists.
This function emulates the operating system’s procedure for making a path canonical, which differs slightly between Windows and UNIX with respect to how links and subsequent path components interact.
Operating system APIs make paths canonical as needed, so it’s not normally necessary to call this function.
Changed in version 3.6: Accepts a path-like object .
Changed in version 3.8: Symbolic links and junctions are now resolved on Windows.
Changed in version 3.10: The strict parameter was added.
Return a relative filepath to path either from the current directory or from an optional start directory. This is a path computation: the filesystem is not accessed to confirm the existence or nature of path or start. On Windows, ValueError is raised when path and start are on different drives.
Changed in version 3.6: Accepts a path-like object .
Return True if both pathname arguments refer to the same file or directory. This is determined by the device number and i-node number and raises an exception if an os.stat() call on either pathname fails.
Changed in version 3.2: Added Windows support.
Changed in version 3.4: Windows now uses the same implementation as all other platforms.
Changed in version 3.6: Accepts a path-like object .
Return True if the file descriptors fp1 and fp2 refer to the same file.
Changed in version 3.2: Added Windows support.
Changed in version 3.6: Accepts a path-like object .
Return True if the stat tuples stat1 and stat2 refer to the same file. These structures may have been returned by os.fstat() , os.lstat() , or os.stat() . This function implements the underlying comparison used by samefile() and sameopenfile() .
Changed in version 3.4: Added Windows support.
Changed in version 3.6: Accepts a path-like object .
Split the pathname path into a pair, (head, tail) where tail is the last pathname component and head is everything leading up to that. The tail part will never contain a slash; if path ends in a slash, tail will be empty. If there is no slash in path, head will be empty. If path is empty, both head and tail are empty. Trailing slashes are stripped from head unless it is the root (one or more slashes only). In all cases, join(head, tail) returns a path to the same location as path (but the strings may differ). Also see the functions dirname() and basename() .
Changed in version 3.6: Accepts a path-like object .
Split the pathname path into a pair (drive, tail) where drive is either a mount point or the empty string. On systems which do not use drive specifications, drive will always be the empty string. In all cases, drive + tail will be the same as path.
On Windows, splits a pathname into drive/UNC sharepoint and relative path.
If the path contains a drive letter, drive will contain everything up to and including the colon:
If the path contains a UNC path, drive will contain the host name and share, up to but not including the fourth separator:
Changed in version 3.6: Accepts a path-like object .
Split the pathname path into a pair (root, ext) such that root + ext == path , and the extension, ext, is empty or begins with a period and contains at most one period.
If the path contains no extension, ext will be » :
If the path contains an extension, then ext will be set to this extension, including the leading period. Note that previous periods will be ignored:
Leading periods of the last component of the path are considered to be part of the root:
Changed in version 3.6: Accepts a path-like object .
True if arbitrary Unicode strings can be used as file names (within limitations imposed by the file system).