Как формировать и создавать директории с помощью Python
Основной подход: модуль pathlib
Для создания директорий и путей в Python рекомендуется использовать встроенный модуль pathlib, появившийся в версии 3.4. Он предоставляет объектно-ориентированный интерфейс для работы с файловой системой и автоматически обрабатывает разделители в зависимости от операционной системы.
Основная операция - создание одной или нескольких вложенных папок - выполняется методом mkdir с двумя ключевыми аргументами:
- parents=True - рекурсивное создание всех недостающих родительских каталогов;
- exist_ok=True - отсутствие ошибки, если целевая папка уже существует.
from pathlib import Path
# Создать структуру data/2025/03/
path = Path('data') / '2025' / '03'
path.mkdir(parents=True, exist_ok=True)
print(f'Папка {path} создана или уже существует')
Python local path (локальный путь в python)
Пояснение шагов:
- Импортируется класс Path из модуля pathlib.
- Конструируется объект пути с помощью оператора / (перегрузка для pathlib). В Windows разделитель подставляется автоматически.
- Вызов mkdir создаёт все вложенные папки, начиная с data, если их не было. Параметр exist_ok предотвращает исключение FileExistsError.
Типичная ошибка: забыть указать parents=True. В этом случае при отсутствии родительской папки возникнет FileNotFoundError. Решение - всегда добавлять этот аргумент при необходимости создания вложенных структур.
Другая проблема - попытка создать путь, совпадающий с именем существующего файла. Метод mkdir в такой ситуации вызовет FileExistsError (если exist_ok=False). Если ожидается, что путь может указывать на файл, следует предварительно проверить path.is_file() и обработать случай.
Цели использования: повседневная работа с файловой системой, создание временных или постоянных каталогов, развёртывание проектов, обеспечение переносимости кода между Windows и Linux/macOS.
Другие способы построения и создания путей
Как создать вложенные папки без pathlib?
Модуль os содержит функцию makedirs, которая работает аналогично mkdir из pathlib, но возвращает None и требует явной проверки существования.
import os
os.makedirs('project/logs/errors', exist_ok=True)
Python path lib (путь к библиотекам python)
Аргумент exist_ok (появился в Python 3.2) подавляет исключение, если папка уже существует. Без него при повторном вызове возникнет OSError.
Проблема: функция os.makedirs не возвращает объект пути, что усложняет дальнейшие манипуляции. Также код становится менее читаемым при работе с цепочками преобразований.
Как собрать путь из частей без сшивания строк?
Функция os.path.join объединяет компоненты пути с корректным разделителем для текущей ОС.
import os
base = 'home'
user = 'user'
docs = 'documents'
full = os.path.join(base, user, docs, 'file.txt')
print(full)
Python script path (путь к текущему скрипту python)
home/user/documents/file.txt (на Linux/macOS)
Python create path (создание пути в python)
Этот метод полезен, когда компоненты пути хранятся в переменных или списках.
Типичная ошибка: передача абсолютного пути в середине списка - os.path.join сбросит все предыдущие части и начнёт с этого абсолютного. Например, os.path.join('a', '/b', 'c') вернёт /b/c.
Как получить абсолютный канонический путь?
Метод resolve() из pathlib преобразует относительный путь в абсолютный, разрешая символические ссылки и ../..
from pathlib import Path
rel = Path('docs/./../data/./file.txt')
abs_path = rel.resolve()
print(abs_path)
/home/user/data/file.txt (пример)
Цель - получить единообразное представление пути перед операциями создания или сравнения.
Важно: resolve() требует, чтобы путь существовал (кроме последнего элемента). Если какая-то часть не существует, поведение может отличаться в разных версиях Python (начиная с 3.6 выбрасывается FileNotFoundError). Альтернатива - Path.absolute() (не разрешает ссылки).
Как создать временный каталог для тестов?
Модуль tempfile предоставляет контекстный менеджер TemporaryDirectory, который автоматически удаляет каталог после завершения работы.
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as tmpdir:
tmp_path = Path(tmpdir)
sub = tmp_path / 'subfolder'
sub.mkdir(parents=True)
# работа с временными файлами
print(f'Временная папка: {tmp_path}')
# после выхода из with папка удаляется
Цель - изолированные тесты, не оставляющие мусора на диске.
Проблема: на Windows удаление может быть отложено из-за открытых файлов. Рекомендуется закрывать все файловые дескрипторы внутри with.
Что делать при ошибках создания пути?
Обёртка с обработкой исключений позволяет корректно реагировать на недостаток прав, нехватку места на диске или конфликт с существующим файлом.
from pathlib import Path
target = Path('/etc/restricted/folder')
try:
target.mkdir(parents=True, exist_ok=True)
except PermissionError:
print('Нет прав на создание папки')
except OSError as e:
print(f'Ошибка файловой системы: {e}')
Такой подход применяется в серверных приложениях, где необходимо логировать проблемы и не прерывать выполнение.
Расширенные примеры создания путей
# Пример 1: создание иерархии с проверкой существования каждого уровня
from pathlib import Path
def create_hierarchy(base: str, sub_dirs: list) -> Path:
"""Создаёт цепочку вложенных папок от base."""
current = Path(base).resolve()
for part in sub_dirs:
current = current / part
if not current.exists():
current.mkdir()
print(f'Создана папка {current}')
else:
print(f'Папка {current} уже существует')
return current
create_hierarchy('temp', ['level1', 'level2', 'level3'])
Создана папка /home/user/temp/level1 Создана папка /home/user/temp/level1/level2 Создана папка /home/user/temp/level1/level2/level3
# Пример 2: создание путей с датой и временем
from pathlib import Path
from datetime import datetime
now = datetime.now()
log_path = Path('logs') / str(now.year) / f'{now.month:02d}' / f'{now.day:02d}'
log_path.mkdir(parents=True, exist_ok=True)
print(f'Папка для логов: {log_path}')
# Результат: logs/2025/03/16 (в день выполнения)
Папка для логов: logs/2025/03/16
# Пример 3: комбинирование os.path и pathlib для обратной совместимости
import os
from pathlib import Path
# Старый код использует os.path
user_home = os.path.expanduser('~')
# Преобразуем в pathlib
home_path = Path(user_home)
config_dir = home_path / '.config' / 'myapp'
config_dir.mkdir(parents=True, exist_ok=True)
print(f'Конфиги в {config_dir}')
Конфиги в /home/user/.config/myapp
# Пример 4: создание пути с уникальным именем (избегание коллизий)
from pathlib import Path
import random
import string
def unique_dir(base: str, prefix: str = 'tmp') -> Path:
while True:
suffix = ''.join(random.choices(string.ascii_lowercase, k=8))
candidate = Path(base) / f'{prefix}_{suffix}'
if not candidate.exists():
candidate.mkdir(parents=True)
return candidate
dir_ = unique_dir('./sessions')
print(f'Создана уникальная папка {dir_}')
Создана уникальная папка ./sessions/tmp_xkqjymz
# Пример 5: использование Path.home() для создания папки в домашнем каталоге
from pathlib import Path
home = Path.home()
downloads = home / 'Downloads' / 'new_project'
downloads.mkdir(parents=True, exist_ok=True)
# На Windows это может быть C:\Users\имя\Downloads\new_project
Папка создана (вывод не требуется, но можно проверить)
# Пример 6: создание симлинков и последующее создание пути по ссылке
from pathlib import Path
original = Path('/tmp/original_dir')
original.mkdir(parents=True, exist_ok=True)
link = Path('/tmp/my_link')
try:
link.symlink_to(original, target_is_directory=True)
except FileExistsError:
pass
# Создаём вложенную папку через ссылку
inside_link = link / 'sub'
inside_link.mkdir(parents=True, exist_ok=True)
print(f'Создано через ссылку: {inside_link.resolve()}')
Создано через ссылку: /tmp/original_dir/sub