pathlib: современная работа с путями

pathlib — это объектный способ работать с путями. Вместо склейки строк вы оперируете объектами Path, которые знают про имя, расширение и родительскую папку.
Суть: путь — это объект Path, а не строка. Склейка через оператор /, разбор через атрибуты .name, .stem, .suffix, .parent.

Раньше пути в Python собирали строками и модулем os.path: os.path.join(folder, name). Это работало, но код получался многословным, а разные ОС использовали разные разделители (/ и \). Модуль pathlib из стандартной библиотеки решил обе проблемы: он даёт единый объект Path, который сам подставляет правильный разделитель.

Главная магия — оператор деления. Path('reports') / '2026' / 'march.txt' собирает путь, как вы интуитивно ожидаете. А разбор пути на части делается через атрибуты, без ручного поиска точек и слешей.

АНАТОМИЯ ПУТИ

  /home/user/reports/march.csv
  \________________/ \___/ \__/
        parent        stem  suffix
                    \__________/
                        name

  name   = 'march.csv'
  stem   = 'march'
  suffix = '.csv'

Проверим разбор пути прямо в браузере. Pyodide включает pathlib, и работа с самим объектом Path (без обращения к реальным файлам) исполнима.

Попробуй сам ▶

from pathlib import Path

# Сборка пути через оператор /
p = Path('reports') / '2026' / 'march.csv'
print('Путь:   ', p)

# Разбор пути на части
print('name:   ', p.name)     # march.csv
print('stem:   ', p.stem)     # march
print('suffix: ', p.suffix)   # .csv
print('parent: ', p.parent)   # reports/2026

# Замена расширения
print('как pdf:', p.with_suffix('.pdf'))

Метод with_suffix — настоящая находка для пакетной обработки: он меняет расширение, не трогая имя. Скоро мы используем его, чтобы массово конвертировать файлы.

У pathlib есть и удобные методы для самой работы с файлами, превращающие рутину в одну строку. Path('config.txt').read_text(encoding='utf-8') читает весь файл в строку, write_text(...) — записывает, а read_bytes() и write_bytes() делают то же с двоичными данными. Не нужно вручную открывать и закрывать файл через open. Для коротких операций это короче и безопаснее. А методы exists(), is_file() и is_dir() отвечают на вопросы о состоянии диска. Вместе с разбором путей это покрывает почти все повседневные нужды автоматизатора, не заставляя помнить разрозненные функции старого модуля os.

Как работает под капотом

Объект Path хранит путь как последовательность частей и при выводе склеивает их разделителем текущей ОС. Оператор / перегружен через метод __truediv__, поэтому path / 'x' возвращает новый объект Path. Сам путь при этом — просто текст: создание Path не обращается к диску и не проверяет, существует ли файл. Проверка (.exists()) — отдельная операция.

Атрибуты вроде .stem вычисляются разбором строки: pathlib находит последнюю точку и делит имя на основу и расширение. Поэтому файл archive.tar.gz даст stem='archive.tar' и suffix='.gz' — учитывается только последняя точка.

Частые ошибки

  • Склеивать пути через + и строки. Это ломается на разных ОС и при двойных слешах. Используйте /.
  • Путать name и stem. name — с расширением, stem — без. Это частый источник багов.
  • Думать, что Path проверяет существование. Создание объекта — это только текст. Существование проверяйте явно.

Best practices

  • Используйте pathlib вместо os.path во всём новом коде.
  • Берите относительные пути от Path(__file__).parent, чтобы скрипт работал из любой папки.
  • Для замены расширения используйте with_suffix, для замены имени — with_name.

Итоги. pathlib — современный стандарт работы с путями: объект Path, склейка через /, разбор через атрибуты. Это основа для любой операции с файлами. Дальше научимся обходить целые папки и искать в них файлы по маске.

Проверьте себя
1. Чему равен p.stem для пути Path('data/report.csv')?
Areport.csv
Breport
C.csv
Ddata/report
2. Что произойдёт при создании Path('/no/such/file.txt')?
AОшибка, потому что файла нет
BСоздастся объект пути, файл при этом не проверяется
CФайл будет создан на диске
DВернётся None