Управление файловой системой и ОС: pathlib против os
Серия 02 – гибкое управление папками и файлами в Python
При создании программ неизбежно приходится создавать файлы, перемещать папки и проверять пути. В Python для этого предусмотрены два «правильных» решения.
Для этого в Python предусмотрены два «правильных» решения: удобный и элегантный pathlib для работы с путями, а также os – модуль, управляющий самой операционной системой, в которой запускается программа.

Если сравнивать, то pathlib – как звезда, а os – как продюсер, который контролирует свет, звук и двери сцены. Вместо того чтобы отказываться от одного из них, лучше использовать оба в соответствии с задачами.
1. Что различает os и pathlib?
С версии Python 3.4 появился pathlib, что значительно улучшило способ работы с путями.
os/os.path- Путь рассматривается как строка.
- Функциональный стиль приводит к длинным цепочкам вызовов:
os.path.join(),basename(),splitext()и т.д. -
Помимо путей, модуль обрабатывает и системные функции (переменные окружения, процессы, права доступа и др.).
-
pathlib - Путь – это объект Path.
- С помощью оператора
/и цепочек методов код становится коротким и понятным. - Для задач «обработки путей»
pathlibобычно предпочтительнее.
2. Сравнение кода по типовым задачам
2.1 Проверка текущего каталога и создание папки
import os
from pathlib import Path
# os
current_os = os.getcwd()
if not os.path.exists("test_os"):
os.makedirs("test_os")
# pathlib
current_pl = Path.cwd()
Path("test_pl").mkdir(exist_ok=True)
Совет: если пути часто используются в коде, pathlib облегчает поддержку.
2.2 Сборка пути (самое заметное отличие)
import os
from pathlib import Path
# os
path_os = os.path.join("usr", "bin", "python")
# pathlib (оператор слеша)
path_pl = Path("usr") / "bin" / "python"
Чем больше частей, тем легче читать pathlib.
3. Почему стоит использовать pathlib: сила «объекта пути»
Преимущества pathlib не ограничиваются только сборкой путей. При извлечении информации о файле различия становятся ещё более заметными.
| Функция | os.path |
pathlib |
|---|---|---|
| Извлечение имени файла | os.path.basename(p) |
p.name |
| Имя без расширения | os.path.splitext(os.path.basename(p))[0] |
p.stem |
| Расширение | os.path.splitext(p)[1] |
p.suffix |
| Родительский каталог | os.path.dirname(p) |
p.parent |
При большом количестве мелких операций код становится более чистым, если использовать pathlib во всём проекте.
4. Практический пример: поиск всех файлов с конкретным расширением
Найдем все файлы .txt в проекте.
from pathlib import Path
base_path = Path.cwd()
txt_files = list(base_path.rglob("*.txt")) # рекурсивный поиск
for file in txt_files:
print(f"Имя файла: {file.name}, Абсолютный путь: {file.resolve()}")
rglob() делает рекурсивный поиск одним вызовом. Для «поиска файлов» pathlib действительно мощнее.
5. Но у os есть свои сильные стороны: управление ОС
Здесь проявляется баланс.
pathlib – эксперт по путям, но os – мастер управления самой ОС.
5.1 Чтение/запись переменных окружения (ключ к развертыванию, безопасности, настройкам)
Разные среды разработки и эксплуатации часто приводят к необходимости хранить настройки в переменных окружения.
import os
# чтение
db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db")
# запись (обычно только для текущего процесса)
os.environ["APP_ENV"] = "production"
API‑ключи, режимы работы, уровни логирования, флаги функций – всё это находится в области os, а не pathlib.
5.2 Запуск процессов/команд: «попросить ОС выполнить»
Вызов внешних команд и управление процессами – это, в сущности, функции ОС. Хотя часто используют subprocess, в основе всё равно лежат функции os.
import os
# простой вызов (возвращает код завершения)
exit_code = os.system("echo hello")
print(exit_code)
Для более тонкого управления (запуск, замена, форк) также доступны функции os. Это совсем другая область, чем работа с путями.
5.3 Управление правами, пользователями, рабочим каталогом и прочим системным окружением
- Изменение прав (Unix‑подобные):
os.chmod() - Смена рабочего каталога:
os.chdir() - Информация о процессе/пользователе:
os.getpid()и др.
Эти функции pathlib не заменяет. Это реальная область, где os обязателен.
6. Вывод: разделяем роли pathlib и os
- Обработка путей / поиск файлов / работа с именами →
pathlibделает код более читаемым и поддерживаемым. - Переменные окружения / процессы / права / общие функции ОС →
os– единственный выбор.
Лучший паттерн:
- «Путь всегда в
Path» - «Когда нужно общаться с ОС, используем
os»
7. Краткое резюме
pathlibповышает читаемость и надёжность кода, работающего с файловой системой.osуправляет самой операционной системой, выходя за рамки путей.- Правильный ответ – не «один или другой», а сочетание
pathlib + os.
Однострочное резюме: операции с путями и файлами – pathlib, управление окружением ОС – os.
Связанные статьи:
Комментариев нет.