Управление файловой системой и ОС: 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.


Связанные статьи: