Для создания сложной структуры директорий в Python, используя модули os и shutil, можно использовать комбинацию функций. Вот несколько способов и объяснения:
1. Создание одиночных директорий с помощью os.makedirs():
Функция os.makedirs(path, exist_ok=False) позволяет создать директорию и все необходимые промежуточные директории. Параметр exist_ok=True позволяет избежать ошибки, если директория уже существует.
import os
try:
  os.makedirs("path/to/nested/directory", exist_ok=True)
  print("Структура директорий успешно создана.")
except OSError as error:
  print(f"Ошибка при создании директории: {error}")
2. Копирование структуры директорий с помощью shutil.copytree():
Если вам нужно скопировать структуру директорий из одного места в другое (без содержимого файлов), можно использовать shutil.copytree(source, destination, dirs_exist_ok=False). Параметр dirs_exist_ok=True позволяет избежать ошибки, если целевая директория уже существует.
import shutil
import os
source_dir = "source_directory"
destination_dir = "destination_directory"
# Создадим исходную директорию для примера
os.makedirs(os.path.join(source_dir, "dir1", "dir2"), exist_ok=True)
try:
    shutil.copytree(source_dir, destination_dir, dirs_exist_ok=True)
    print("Структура директорий успешно скопирована.")
except OSError as error:
    print(f"Ошибка при копировании структуры директорий: {error}")
3. Создание структуры директорий и файлов с помощью цикла и функций os.makedirs() и open():
Этот метод предоставляет наибольшую гибкость, позволяя создавать как директории, так и пустые файлы в нужных местах.
import os
structure = {
    "root_dir": {
        "subdir1": {
            "file1.txt": "",
            "file2.txt": ""
        },
        "subdir2": {
            "file3.txt": ""
        },
        "empty_dir": {}
    }
}
def create_structure(structure, base_path="."):
    for name, content in structure.items():
        path = os.path.join(base_path, name)
        if isinstance(content, dict):
            try:
                os.makedirs(path, exist_ok=True)
                print(f"Создана директория: {path}")
            except OSError as e:
                print(f"Ошибка при создании директории {path}: {e}")
            create_structure(content, path)  # Рекурсивный вызов для поддиректорий
        else:
            try:
                with open(path, "w") as f: #Создаем файл если это не директория
                    f.write(content)
                print(f"Создан файл: {path}")
            except OSError as e:
                print(f"Ошибка при создании файла {path}: {e}")
create_structure(structure)
Пояснения:
os.makedirs(path, exist_ok=True) создает все необходимые промежуточные директории, если они не существуют.shutil.copytree(source, destination, dirs_exist_ok=True) копирует всю структуру каталогов из source в destination.  dirs_exist_ok=True позволяет избежать исключения, если целевой каталог уже существует.structure определяет желаемую структуру директорий и файлов. Функция create_structure рекурсивно обходит этот словарь, создавая соответствующие директории и пустые файлы.Обработка ошибок:
Важно обрабатывать возможные исключения OSError при создании директорий или копировании структуры, чтобы предотвратить неожиданное завершение программы.  Использование блоков try...except позволяет перехватывать ошибки и выводить информативные сообщения.
Важно: Перед выполнением любых операций с файловой системой рекомендуется проверить существование директорий и файлов, чтобы избежать нежелательных результатов.