Начало работы с pathlib — объектно-ориентированное управление путями

Когда вы работаете с Python, часто возникает необходимость обрабатывать пути к файлам или директориям. Например, это может быть сохранение логов, чтение и запись файлов конфигурации или организация файлов данных. Ранее такие задачи решались с использованием различных модулей, таких как os.path, glob или shutil, но сейчас это уже не нужно. Почему?

Потому что есть pathlib.

Что такое pathlib?

pathlib — это объектно-ориентированный модуль для обработки путей, который появился в Python 3.4. Если ранее путь к файлу рассматривался как простая строка, то pathlib рассматривает "сам путь" как один объект. Это делает операции соединения путей, проверки на существование и чтения/записи файлов гораздо более ясными и удобочитаемыми.

from pathlib import Path

▶ Этот класс Path автоматически работает с PosixPath (macOS/Linux) или WindowsPath, в зависимости от вашей операционной системы. Это значит, что вам не нужно беспокоиться, на какой ОС вы работаете!


Основные функции и примеры использования pathlib

1. Создание объекта пути

p = Path('data/example.txt')
print(p.resolve())  # возвращает абсолютный путь

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

2. Соединение путей: использование оператора /

data_dir = Path('data')
file_path = data_dir / 'sample.txt'

Возможность соединять пути с помощью оператора / очень питонична. Это более читаемо и безопасно, чем конкатенация строк.

3. Извлечение информации о пути

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

p = Path('data/sample.txt')
print(p.parent)   # data
print(p.name)     # sample.txt
print(p.stem)     # sample
print(p.suffix)   # .txt

4. Проверка существования

Возвращает результат в виде логического значения.

p.exists()     # существует ли
p.is_file()    # является ли файлом?
p.is_dir()     # является ли директорией?

5. Создание директории

p = Path('logs/2025/05')
p.mkdir(parents=True, exist_ok=True)

Можно создать вложенные директории одним вызовом, и если они уже существуют, ошибок не будет.

6. Чтение и запись файлов

p = Path('output.txt')
p.write_text("Hello, World!")

text = p.read_text()
print(text)

Также можно работать с бинарными файлами:

p.write_bytes(b'binary data')
data = p.read_bytes()

7. Поиск файлов/директорий

print(list(Path('.').glob('*.py')))      # список .py файлов в текущей папке
print(list(Path('.').rglob('*.py')))     # рекурсивный поиск в подкаталогах

glob() возвращает генератор, поэтому лучше преобразовать его в список для просмотра.

8. Удаление, перемещение, переименование файлов/директорий

p.unlink()           # удалить
p.rename('newname')  # переименовать (в пределах той же директории)
p.replace('newpath') # переместить и перезаписать

rename() может завершиться неудачей, если целевой путь существует, поэтому используйте replace(), если необходимо перезаписать. Для копирования используйте shutil.copy().


Сравнение os.path и pathlib

# os.path
import os
os.path.exists('foo/bar.txt')

# pathlib
Path('foo/bar.txt').exists()
  • Код стал гораздо более читаемым и понятным.
  • Структура синтаксиса похожа на часто используемые команды в Linux, такие как cd, ls, mkdir, что делает её знакомой.

Почему нам стоит использовать pathlib?

  • Структурный код с использованием объектов Path вместо строк.
  • Независимая от операционной системы обработка путей (Windows против POSIX)
  • Интеграция функций os.path, glob, shutil в единое целое
  • Улучшение поддерживаемости в тестовом коде, логировании, обработке ошибок и т.д.

Тукс собирает блоки файлового пути на футболке Python

Заключение

Как Counter и defaultdict сделали работу с коллекциями более элегантной, так и pathlib полностью меняет подход к управлению файловыми путями. Теперь вы можете забыть о трудностях, связанных с обработкой строк. Попробуйте выполнить примеры, приведенные в этой статье, и вы быстро освоите их.

В следующей части мы рассмотрим, как с помощью shutil автоматизировать копирование и резервное копирование файлов. Ожидайте с нетерпением!

Чтобы узнать о предыдущей статье, вы можете перейти по следующей ссылке.

Стандартная библиотека Python 1 - collections.Counter

Стандартная библиотека Python 2 - collections.defaultdict