Python: безопасное создание вложенных каталогов

Создать сразу несколько вложенных каталогов в Python можно по-разному в зависимости от используемой версии языка. Ниже разберём четыре варианта на примере такой структуры:

Пример структуры каталогов

Что нужно знать


Пример 1: pathlib.Path.mkdir

Этот способ подходит для Python 3.5 и выше.

from pathlib import Path
Path("/root/dirA/dirB").mkdir(parents=True, exist_ok=True)

Что важно знать о параметрах:

  • parents по умолчанию False. Если родительского каталога ещё нет, выбрасывается FileNotFoundError. Например, при попытке создать /folder1/folder2/folder3 без существующего folder1 ничего не получится. Установка parents=True решает проблему — будут созданы все промежуточные каталоги.

  • exist_ok по умолчанию False. Если каталог уже существует, выбрасывается FileExistsError. exist_ok=True подавляет это исключение.

Примечание

Указывайте абсолютный путь, а не относительный. Если каталог уже существует, при exist_ok=True ошибки не будет.


Пример 2: os.makedirs

Подходит для Python 3.2 и выше.

import os

os.makedirs("/root/dirA/dirB")

Функция os.makedirs() сама создаёт все недостающие промежуточные каталоги. Аргумент — целевой путь.


Пример 3: distutils.dir_util

import distutils.dir_util

distutils.dir_util.mkpath("/root/dirA/dirB")

Похоже на os.makedirs(), но используется метод mkpath(). Если каталог уже существует, исключения не будет.


Пример 4: обработка существующего каталога

import os

try:
    os.makedirs("/dirA/dirB")
except FileExistsError:
    print("File already exists")

Если os.makedirs() встречает уже существующий каталог, он выбрасывает FileExistsError. В этом примере мы перехватываем исключение и обрабатываем его сами.


Как это работает

Все четыре способа дают одинаковый результат — создаётся цепочка каталогов. Разница лишь в API и в том, как обрабатывается ситуация, когда каталоги уже есть. В современном коде на Python чаще всего используют pathlib как более объектный и удобный интерфейс.