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 как более объектный и удобный интерфейс.