# Управление файловой системой и ОС: pathlib против os > **Серия 02 – гибкое управление папками и файлами в Python** При создании программ неизбежно приходится создавать файлы, перемещать папки и проверять пути. В Python для этого предусмотрены два «правильных» решения. Для этого в Python предусмотрены два «правильных» решения: удобный и элегантный **`pathlib`** для работы с путями, а также **`os`** – модуль, управляющий самой операционной системой, в которой запускается программа. ![Встреча машины и цифрового мира](/media/editor_temp/6/dde8bc58-b467-4fe2-9370-24899d41a7bd.png) Если сравнивать, то `pathlib` – как звезда, а `os` – как продюсер, который контролирует свет, звук и двери сцены. Вместо того чтобы отказываться от одного из них, лучше использовать оба в соответствии с задачами. --- ## 1. Что различает os и pathlib? {#sec-92641994f71a} С версии Python 3.4 появился `pathlib`, что значительно улучшило способ работы с путями. * **`os` / `os.path`** * Путь рассматривается как **строка**. * Функциональный стиль приводит к длинным цепочкам вызовов: `os.path.join()`, `basename()`, `splitext()` и т.д. * Помимо путей, модуль обрабатывает и **системные функции** (переменные окружения, процессы, права доступа и др.). * **`pathlib`** * Путь – это **объект Path**. * С помощью оператора `/` и цепочек методов код становится коротким и понятным. * Для задач «обработки путей» `pathlib` обычно предпочтительнее. --- ## 2. Сравнение кода по типовым задачам {#sec-273fe3d2efe4} ### 2.1 Проверка текущего каталога и создание папки {#sec-707744fc63d4} ```python 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 Сборка пути (самое заметное отличие) {#sec-55f0047ba895} ```python 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: сила «объекта пути» {#sec-a7e299456c6e} Преимущества `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. Практический пример: поиск всех файлов с конкретным расширением {#sec-1313166407f5} Найдем все файлы `.txt` в проекте. ```python 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 есть свои сильные стороны: управление ОС {#sec-42d7841b5743} Здесь проявляется баланс. **`pathlib`** – эксперт по путям, но **`os`** – мастер управления самой ОС. ### 5.1 Чтение/запись переменных окружения (ключ к развертыванию, безопасности, настройкам) {#sec-bc07d2294385} Разные среды разработки и эксплуатации часто приводят к необходимости хранить настройки в переменных окружения. ```python import os # чтение db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db") # запись (обычно только для текущего процесса) os.environ["APP_ENV"] = "production" ``` API‑ключи, режимы работы, уровни логирования, флаги функций – всё это находится в области `os`, а не `pathlib`. --- ### 5.2 Запуск процессов/команд: «попросить ОС выполнить» {#sec-be8e97bf9b7c} Вызов внешних команд и управление процессами – это, в сущности, функции ОС. Хотя часто используют `subprocess`, в основе всё равно лежат функции `os`. ```python import os # простой вызов (возвращает код завершения) exit_code = os.system("echo hello") print(exit_code) ``` Для более тонкого управления (запуск, замена, форк) также доступны функции `os`. Это совсем другая область, чем работа с путями. --- ### 5.3 Управление правами, пользователями, рабочим каталогом и прочим системным окружением {#sec-3b5ac9f93cf3} * Изменение прав (Unix‑подобные): `os.chmod()` * Смена рабочего каталога: `os.chdir()` * Информация о процессе/пользователе: `os.getpid()` и др. Эти функции `pathlib` не заменяет. Это реальная область, где `os` обязателен. --- ## 6. Вывод: разделяем роли pathlib и os {#sec-a1f526df17df} * **Обработка путей / поиск файлов / работа с именами** → `pathlib` делает код более читаемым и поддерживаемым. * **Переменные окружения / процессы / права / общие функции ОС** → `os` – единственный выбор. Лучший паттерн: * «Путь всегда в `Path`» * «Когда нужно общаться с ОС, используем `os`» --- ## 7. Краткое резюме {#sec-94950e4d35ef} * `pathlib` повышает читаемость и надёжность кода, работающего с файловой системой. * `os` управляет самой операционной системой, выходя за рамки путей. * Правильный ответ – **не «один или другой», а сочетание `pathlib + os`**. **Однострочное резюме**: операции с путями и файлами – `pathlib`, управление окружением ОС – `os`. --- **Связанные статьи:** - [[Python стандартная библиотека - 0] Что такое стандартная библиотека Python? Руководство для новичков](/ko/whitedec/2026/1/29/python-standard-library/) - [Покорение стандартной библиотеки Python 3 - pathlib](/ko/whitedec/2025/5/8/python-standard-library-pathlib/)