Работа с каталогами в Python
Каталог — это набор файлов и подкаталогов. Каталог внутри каталога называется подкаталогом. В Python есть модуль os, который предоставляет множество полезных методов для работы с каталогами и файлами.
Текущий каталог в Python
Мы можем вывести текущий каталог с помощью метода getcwd() модуля os . Этот метод возвращает текущий рабочий каталог в виде строки. Например:
Изменение каталога в Python
В Python мы можем изменить текущий рабочий каталог с помощью метода chdir(). Новый путь, который мы хотим использовать, нужно указать при вызове этого метода в виде строки. При этом для разделения элементов пути мы можем использовать как прямую косую черту / , так и обратную косую черту \ . Например:
Список каталогов и файлов в Python
Все файлы и подкаталоги внутри каталога можно получить с помощью метода listdir(). Этот метод принимает путь и возвращает список подкаталогов и файлов по указанному пути.
Если путь не указан, возвращается список подкаталогов и файлов из текущего рабочего каталога.
Почему стоит использовать Pathlib в качестве альтернативы модуля OS
![]()
Как специалист по исследованию данных, я ежедневно работаю с путями и файлами для чтения и записи данных.
Обычно я использую модуль Python os.path для выполнения таких операций, как объединение путей, проверка содержимого каталога и создание папок. С помощью этого модуля можно с легкостью получить доступ к файловой системе.
В этой статье я опровергну эту практику, представив другую библиотеку управления путями — Pathlib.
Мы посмотрим, как работает эта библиотека, чем она отличается от модуля os.path, какие возможности и преимущества она предоставляет и когда ее следует (или не следует) использовать.
Проблема модуля OS
Модуль os популярен, и он существует уже долгое время. Однако мне всегда казалось, что он обрабатывает пути неестественным образом. Вот причины, которые заставили меня усомниться в использовании этого модуля
- ОS — большой модуль. В нем, конечно, есть подмодуль path для управления путями и их объединения. Однако если нужно выполнить системные операции с этими путями (создать папку, перечислить содержимое внутри нее или переименовать и удалить файл), то приходится использовать другие методы, которые либо присутствуют где-то еще в иерархии пакетов ( os.makedirs, os.listdir, os.rename и т. д.), либо импортированы из других модулей, таких как shutil или glob . Хорошенько “покопавшись”, вы сможете найти эти методы, но это кажется ненужным усилием.
- OS представляет пути в их самом грубом формат — строковых значениях. Это сильно ограничивает возможности, так как не дает прямого доступа к такой информации, как свойства файла и его метаданные, и не позволяет выполнять операции с файловой системой путем вызова некоторых специальных методов.
Например, чтобы проверить, существует ли путь, вы вводите что-то вроде os.path.exists(some_path) . Но не проще ли было бы получить доступ к этой информации непосредственно из объекта path через метод или атрибут класса? - Модуль os не позволяет находить пути, соответствующие заданному шаблону, внутри иерархии. Допустим, нужно рекурсивно найти все файлы __init__.py внутри сложной структуры папок. Чтобы сделать это, придется объединить os с другим модулем под названием glob . К этому, конечно, можно привыкнуть, но неужели вам нужно два модуля для выполнения такой задачи?
- Это скорее вопрос личного предпочтения, но я всегда считал синтаксис os немного громоздким.
Что такое Pathlib?
Pathlib является частью стандартной библиотеки Python. Она была введена в версию Python 3.4 (см. PEP 428) с целью представления путей не в виде простых строк, а в виде многофункциональных объектов Python с множеством полезных методов и атрибутов.
Вот определение из официальной документации:
“Цель этой библиотеки — предоставить простую иерархию классов для работы с путями файловой системы и обычными операциями, которые пользователи выполняют с ними”.
Pathlib призвана облегчить вышеупомянутые трудности, возникающие при использовании модуля os . Давайте посмотрим на некоторые из возможностей этого компонента Python.
Более подробную информацию об этой библиотеке можно найти в официальной документации.
У Pathlib более интуитивно понятный синтаксис
Чтобы создать путь с помощью Pathlib, нужно импортировать класс Path и передать ему строку. Эта строка указывает на путь в файловой системе, который не обязательно должен существовать.
Теперь у вас есть доступ к объекту Path . Как выполнять простые операции?
- Объединение путей
Pathlib использует оператор / для объединения путей. Сначала эта функция может показаться забавной, но на самом деле она облегчает чтение кода.
Давайте сравним. Чтобы объединить пути с помощью модуля os , нужно сделать примерно следующее:
С Pathlib тот же код будет выглядеть вот так:
По сути, Pathlib усовершенствовал оператор / для выполнения объединения путей.
- Получение текущего рабочего/ домашнего каталога
Под эту задачу уже предусмотрены методы:
- Чтение файла
Вы можете либо использовать open с контекстным менеджером, как это делается в случае обычного пути, либо использовать read_text или read_bytes .
Очевидно, что функций у Pathlib гораздо больше. Рассмотрим наиболее интересные из них.
Простое создание файлов и каталогов
После того, как объект Path создан, он может самостоятельно выполнять операции с файловой системой, вызывая свои внутренние методы. Например, объект может создать папку или открыть файл, просто вызвав методы mkdir и touch .
Вот как объект Path создает папку:
Тот же принцип используется и при создании файлов:
Конечно, вы можете выполнить эти операции с помощью модуля os , но для этого необходимо вызвать другую функцию, например makedirs :
Перемещение по иерархии файловой системы с помощью обращения к родителям
Каждый объект Path имеет свойство parent , которое возвращает объект Path родительской папки. Это облегчает работу с большими иерархиями папок. Поскольку Path являются объектами, для доступа к нужному родителю можно использовать цепочку методов:
Чтобы избежать построения цепочки свойств parent для доступа к n-му предыдущему родителю, можно вызвать свойство parents , которое возвращает список всех родителей, предшествующих текущей папке:
Выполнение итераций в каталогах и подгонка под шаблон
Предположим, у вас есть объект Path, который указывает на каталог. Pathlib позволяет легко итерировать содержимое этого каталога, а также получать файлы и папки, соответствующие определенному шаблону.
Помните модуль glob , который импортировался вместе с модулем os , чтобы получить пути, соответствующие шаблону?
Так вот, объекты Path включают метод glob и его рекурсивную версию rglob для выполнения аналогичных задач, но с гораздо более легким синтаксисом.
Допустим, нужно подсчитать количество файлов Python в конкретной папке. Вот как это можно сделать:
Каждый объект Path имеет множество полезных атрибутов
Каждый объект Path имеет множество полезных методов и атрибутов, которые совершают операции, ранее выполнявшиеся другими библиотеками, а не os (например, glob и shutil ).
- .exists() : проверка наличия пути в файловой системе.
- .is_dir() : проверка соответствия пути каталогу.
- .is_file() : проверка соответствия пути файлу.
- .is_absolute() : проверка абсолютности пути.
- .chmod() : изменение режима файла и разрешений.
- is_mount() : проверка того, является ли путь точкой монтирования.
- .suffix : получение расширение файла.
Это еще не все методы. Вы можете ознакомиться с полным их перечнем здесь.
Это была краткая статья о некоторых возможностях Pathlib. Если вы используете версию Python +3.4 и думаете о переходе на Pathlib, смело делайте это. Переход с os на Pathlib довольно прост.
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). Регистрация открыта по ссылке.
Как задать путь к файлу в Python?
Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!
Самый простой вариант — не самый верный!
Внимание! У этого способа обнаружен недостаток!
Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:
Пример относительного пути:
Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Пример абсолютного пути:
Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!
Указываем путь к файлу правильно!
Внимание! Годный вариант!
Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:
Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:
Задаем относительный путь с помощью Path!
После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):
У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! Ссылка на канал: «Кодим на Python!»
Задаем абсолютный путь с помощью Path
- cwd() — возвращает путь к рабочей директории
- home() — возвращает путь к домашней директории
Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :
Пример 1: с использованием функции cwd():
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».
Представленный выше код можно оптимизировать и записать в одну строку:
Пример2: с использованием функции home():
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».
Сократим представленный выше код:
Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().