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, склейка через /, разбор через атрибуты. Это основа для любой операции с файлами. Дальше научимся обходить целые папки и искать в них файлы по маске.