129просмотров
10.4%от подписчиков
22 марта 2026 г.
Score: 142
Используем shutil: копируем и удаляем файлы без боли Работа с файлами в Python часто начинается с модуля os, но как только дело доходит до копирования и целых папок — на сцену выходит shutil. Это такой «швейцарский нож» для файловой системы. Подключается просто: import shutil
from pathlib import Path ## Копирование файлов Базовый вариант — shutil.copy(): src = Path("data/source.txt")
dst = Path("backup/source_copy.txt") shutil.copy(src, dst) copy переносит содержимое и права доступа, но не метаданные (например, время изменения). Если нужны максимально точные «клоны» файла, есть copy2: shutil.copy2(src, dst) Разница — в сохранении метаданных (atime, mtime и т.п.). Для бэкапов это часто критично. ## Копирование папок Для директорий используется copytree: src_dir = Path("data")
dst_dir = Path("data_backup") shutil.copytree(src_dir, dst_dir) Важно: если data_backup уже существует, будет ошибка. В Python 3.8+ можно указать dirs_exist_ok=True: shutil.copytree(src_dir, dst_dir, dirs_exist_ok=True) Так можно «обновлять» уже существующую папку бэкапа. ## Удаление файлов и папок Одиночные файлы удобнее удалять через Path.unlink(), а вот для целых деревьев директорий есть rmtree: target_dir = Path("old_logs") shutil.rmtree(target_dir) Команда безвозвратная: корзины не будет, поэтому перед вызовом стоит дважды проверить путь или добавить «защиту от дурака»: if "backup" in str(target_dir): shutil.rmtree(target_dir) ## Мини-утилита «скопировать и почистить» Соберём всё вместе: скопируем папку и удалим старую: def move_folder(src: Path, dst: Path): shutil.copytree(src, dst, dirs_exist_ok=True) shutil.rmtree(src) move_folder(Path("tmp_uploads"), Path("storage/uploads")) Фактически мы реализовали аналог «перемещения» папки силами shutil. --- shutil хорош тем, что закрывает 80% задач по управлению файлами: копирование, рекурсивные операции, бэкапы, чистка временных директорий. А главное — код остаётся коротким и читаемым, без ручного обхода каталогов и велосипедов на os.listdir().