Pathlib — манипуляция путями, создание и удаление папок и файлов

Pathlib на примерах Python 3

Модуль Pathlib в Python упрощает работу с файлами и папками. Он доступен в Python 3.4 и более поздних версиях. Pathlib сочетает в себе лучшее из модулей файловой системы Python — os, os.path, glob и так далее.

Содержание статьи

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

В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.

Концепт пути и директории в Python

Перед началом подробного рассмотрения модуля Pathlib важно разобраться в разнице между главными концептами темы — путем (path) и директорией (directory).

  • Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
  • Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
  • Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
  • Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
  • Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.

Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Как использовать модуль Pathlib?

Для работы с Pathlib в Python требуется импортировать все классы данного модуля, используя следующую команду:

В качестве первого задания давайте извлечем текущую рабочую директорию и домашнюю директорию объектов, используя следующий код:

Вместо импорта всех классов можно использовать import pathlib. В таком случае, задействуя классы внутри модуля, требуется добавлять через pathlib.

Зачем использовать модуль Pathlib?

Если вы некоторое время работали с языком Python, у вас может возникнуть вопрос. Зачем нужен модуль Pathlib, когда уже есть модули os, os.path, glob и прочие? Это хороший вопрос. Давайте попробуем ответить на него, разобрав следующий пример.

Допустим, мы хотим создать файл под названием "output/output.xlsx" в текущем рабочем каталоге. Следующий код пытается сделать это с помощью модуля os.path. Также используются функции os.getcwd и os.path.join.

Альтернативный способ:

Хотя код работает, он выглядит несколько странно, плохо читается, в нем сложно уловить суть. Представьте, как данный код выглядел бы, если бы мы хотели создать новый файл внутри глубоко расположенной директории.

Данный код можно переписать, используя модуль Pathlib:

Такой формат проще укладывается в голове. В Pathlib функция Path.cwd() используется для получения текущего рабочего каталога, а оператор / используется вместо os.path.join для объединения частей пути в составной объект пути.

Шаблон вложенности функций в модуле os.path заменяется классом Path модуля Pathlib, что представляет путь через объединение методов и атрибутов. Умная перегрузка оператора / делает код читабельным и простым в обращении.

Другое преимущество метода, предоставляемого модулем Pathlib, заключается в том, что объект Path создается вместо строкового представления пути. У этого объекта есть несколько удобных методов, что имеют значительное преимущество перед работой с необработанными строками, которые представляют пути.

Создание и удаление папок через Pathlib

Классический модуль os.path используется только для манипуляции строками пути. Чтобы что-то сделать с путем, например, создать директорию, нам нужен модуль os. Модуль os предоставляет набор функций для работы с файлами и каталогами, например: mkdir для создания директории, rename для переименования, а getsize для получения ее размера.

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

Пример кода, написанный с использованием модуля os:

Если мы используем объекты path модуля Pathlib для достижения той же функциональности, конечный код будет читабельнее и легче для понимания:

В модуле os сложновато найти утилиты, связанные с путем. Модуль Pathlib решает эту проблему, заменяя утилиты модуля os методами объектов путя. Давайте попробуем разобраться в этом на примере следующего кода:

Здесь функция generate_data() принимает путь к файлу в качестве параметра и записывает данные в другой путь. Однако, если файл, который передается в качестве параметра, не изменяется, так как в последний раз была выполнена функция generate_data(), генерируется пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Переменная outpath сохраняет данные, соединяя текущий рабочий каталог с названием файла «output». Мы также создаем временную версию, названную outpath.tmp. Если размер временной версии не равен нулю, что означает, что это не пустой файл, тогда временная версия переименовывается в outpath, в противном случае временная версия удаляется, а старая версия сохраняется.

Используя модуль os, манипулирование путями файловых систем в виде строковых объектов становится несколько корявым, поскольку используется несколько вызовов os.path.join(), os.getcwd() и так далее. Во избежание данной проблемы модуль Pathlib предлагает набор классов, что могут использоваться для популярных операций с путами через более читабельный, простой, объектно-ориентированный способ.

Попробуем переписать вышеуказанный код с модулем Pathlib:

При использовании Pathlib os.getcwd() становится Path.cwd(), а оператор '/' нужен для объединения путей на месте os.path.join. Вместе с модулем Pathlib можно значительно упростить код, задействуя операторы и вызовы метода.

Популярные методы и их предназначение:

  • Path.cwd(): Возвращает путь объекта текущей рабочей директории;
  • Path.home(): Возвращает путь объекта домашней директории;
  • Path.stat(): Возвращает информацию о пути;
  • Path.chmod(): Меняет режим и уровень доступа файла;
  • Path.glob(pattern): Получение всех файлов которые соответствую паттерну, например *.jpg (все картинки) или *.mp3 (все песни);
  • Path.mkdir(): создает новую папку по данному пути;
  • Path.open(): Открывает файл, созданный в пути;
  • Path.rename(): Переименовывает файл или директорию указанной цели;
  • Path.rmdir(): Удаляет пустую директорию;
  • Path.unlink(): Удаляет файл или символическую ссылку.

Генерация кроссплатформенных путей в Pathlib

Пути используют разные соглашения в разных операционных системах. Windows использует обратный слеш \ между названиями папок, тогда как все другие популярные операционные системы используют прямой слеш /.

Если вы хотите, чтобы ваш код работал, независимо от базовой ОС, вам нужно будет обрабатывать различные соглашения, характерные для базовой платформы. Модуль Pathlib упрощает работу с путями к файлам. В Pathlib можно просто передать путь или название файла объекту Path(), используя слеш, независимо от ОС. Pathlib занимается всем остальным.

Объект Path() конвертирует / в слеш соответствующий операционной системе. pathlib.Path может представлять путь Windows или Posix. Кроме того, Pathlib решает многие кросс-функциональные баги, легко обрабатывая пути.

Получение информации о пути в Pathlib

Во время работы с путями зачастую требуется найти родительскую директорию файла/папки или получить символические ссылки. У класса Path есть несколько удобных для этого методов, различные части пути доступны как свойства, что включают следующее:

  • drive: строка, что представляет название жесткого диска. К примеру, PureWindowsPath('c:/Program Files/CSV').drive вернет "C:";
  • parts: возвращает кортеж, что дает доступ к компонентам пути;
  • name: компонент пути без директории;
  • parent: последовательность обеспечивает доступ к логическим предкам пути;
  • stem: финальный компонент пути без суффикса;
  • suffix: разрешение файла финального компонента;
  • anchor: часть пути перед директорией. / используется для создания дочерних путей и имитации поведения os.path.join;
  • joinpath: совмещает путь с предоставленными аргументами;
  • match(pattern): возвращает True/False, основываясь на совпадении пути с предоставленным шаблоном поиска.

Например, у нас есть данный путь "/home/projects/pyscripts/python/sample.md":

  • path: — возвращает PosixPath(‘/home/projects/pyscripts/python/sample.md’);
  • path.parts: — возвращает (‘/’, ‘home’, ‘projects’, ‘pyscripts’, ‘python’);
  • path.name: — возвращает ‘sample.md’;
  • path.stem: — возвращает ‘sample’;
  • path.suffix: — возвращает ‘.md’;
  • path.parent: — возвращает PosixPath(‘/home/projects/pyscripts/python’);
  • path.parent.parent: — возвращает PosixPath(‘/home/projects/pyscripts’);
  • path.match('*.md'): возвращает True;
  • PurePosixPath('/python').joinpath('edited_version'): возвращает (‘home/projects/pyscripts/python/edited_version.

Альтернатива для модуля glob

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

Pathlib предоставляет свою реализацию glob:

Функциональность glob доступна с объектами Path. Следовательно, модуль Pathlib упрощают сложные задачи.

Чтение и запись файлов с использованием Pathlib

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

  • read_text: Файл открывается в текстовом режиме для чтения содержимого файла и его закрытия после чтения;
  • read_bytes: Используется для открытия файла в бинарном режиме, возвращения содержимого в бинарном форме и последующего закрытия файла;
  • write_text: Используется для открытия файла, записи туда текста и последующего закрытия;
  • write_bytes: Используется для записи бинарных данных в файл и закрытия файла по завершении процесса.

Давайте испытаем модуль Pathlib используя популярные файловые операции. Следующий пример используется для чтения содержимого файла:

Метод read_text() для объекта Path используется для чтения содержимого файла. В примере ниже данные записываются в файл, в текстовом режиме:

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

Заключение

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