Для рекурсивного копирования директорий в Python с использованием модуля shutil
, применяется функция shutil.copytree()
.
Функция copytree()
принимает как минимум два аргумента:
src
: Путь к исходной директории, которую необходимо скопировать.dst
: Путь к целевой директории, куда будет скопирована исходная директория. Если целевая директория не существует, она будет создана. Если существует, и она пустая, файлы из исходной будут скопированы в нее. Если в целевой директории есть другие файлы/папки, копирование завершится с ошибкой (по умолчанию).Пример использования:
import shutil
import os
source_dir = '/путь/к/исходной/директории'
destination_dir = '/путь/к/целевой/директории'
try:
shutil.copytree(source_dir, destination_dir)
print(f"Директория '{source_dir}' успешно скопирована в '{destination_dir}'")
except FileExistsError:
print(f"Ошибка: Директория '{destination_dir}' уже существует.")
except shutil.Error as errors:
print(f"Ошибка при копировании:")
for error in errors.errors:
src, dst, msg = error
print(f" Не удалось скопировать '{src}' в '{dst}': {msg}")
except Exception as e:
print(f"Произошла непредвиденная ошибка: {e}")
Важные замечания:
copytree()
не будет перезаписывать существующие файлы или директории в целевой директории. Если целевая директория существует и не пуста, возникнет исключение FileExistsError
.ignore
, который принимает функцию, возвращающую список игнорируемых элементов. Это позволяет гибко настраивать процесс копирования. Аргумент dirs_exist_ok=True
, доступный начиная с Python 3.8, позволяет избежать ошибки FileExistsError
при существовании целевой директории, объединяя содержимое исходной с целевой.copytree()
выбрасывает исключение shutil.Error
, которое содержит список кортежей с информацией об ошибках. Необходимо предусмотреть обработку этого исключения для обеспечения стабильной работы программы.copytree()
пытается скопировать метаданные файлов (например, права доступа, время последнего изменения). Это поведение можно контролировать с помощью других аргументов функции.Пример с обработкой ошибок и игнорированием:
import shutil
import os
def ignore_patterns(patterns):
def _ignore_patterns(path, names):
return set(shutil.ignore_patterns(*patterns)(path, names))
return _ignore_patterns
source_dir = '/путь/к/исходной/директории'
destination_dir = '/путь/к/целевой/директории'
try:
shutil.copytree(source_dir, destination_dir, ignore=ignore_patterns('*.pyc', 'tmp*'), dirs_exist_ok=True)
print(f"Директория '{source_dir}' успешно скопирована в '{destination_dir}'")
except shutil.Error as errors:
print(f"Ошибка при копировании:")
for error in errors.errors:
src, dst, msg = error
print(f" Не удалось скопировать '{src}' в '{dst}': {msg}")
except Exception as e:
print(f"Произошла непредвиденная ошибка: {e}")
В этом примере игнорируются все файлы с расширением .pyc
и все файлы/директории, начинающиеся с tmp
. Также, используется dirs_exist_ok=True
, чтобы избежать FileExistsError
, если целевая директория уже существует.