
Копирование файлов в Python часто требуется для резервного хранения данных, автоматизации обработки и миграции проектов. Наиболее распространённый подход – использование модуля shutil, который позволяет выполнять операции copy, copy2 и copyfile с минимальным количеством кода и сохранением метаданных при необходимости.
Для проектов, где важна работа с объектами файловой системы в стиле объектно-ориентированного программирования, целесообразно применять pathlib. Этот модуль упрощает создание кроссплатформенных скриптов и позволяет копировать файлы с помощью метода Path().write_bytes() после чтения read_bytes().
При обработке больших файлов важно учитывать использование буферизации. Чтение и запись файла блоками по несколько мегабайт предотвращает переполнение оперативной памяти и ускоряет копирование. Такой подход особенно актуален при работе с видео, базами данных и архивами.
Ключевым аспектом является корректная обработка ошибок. Проверка существования исходного файла, прав доступа и доступного места на диске позволяет избежать потери данных и прерывания скриптов. Python предоставляет конструкции try/except, которые гарантируют безопасное выполнение копирования и возможность логирования проблем.
Копирование файлов с помощью модуля shutil

Модуль shutil предоставляет набор функций для работы с файлами и директориями. Основной метод для копирования – shutil.copy(src, dst), который копирует содержимое файла src в файл или директорию dst, создавая новый файл, если его нет. При этом метаданные файла, такие как дата изменения, не сохраняются.
Для сохранения атрибутов исходного файла используют функцию shutil.copy2(src, dst). Она копирует не только данные, но и метаданные, включая время последней модификации и права доступа, что важно при синхронизации файлов между системами.
Если требуется скопировать файл с конкретным именем в директории назначения, рекомендуется использовать shutil.copyfile(src, dst). Этот метод работает только с файлами и не создает директории автоматически, поэтому перед копированием следует убедиться в существовании целевой папки.
Для пакетного копирования файлов внутри папок удобно применять shutil.copytree(src, dst, dirs_exist_ok=True), которая копирует всю структуру каталогов. Параметр dirs_exist_ok=True предотвращает ошибки при наличии уже существующих директорий в целевом пути.
Рекомендуется использовать конструкции try/except для обработки ошибок при копировании: отсутствие исходного файла, проблемы с правами доступа или нехватка места на диске могут вызвать исключения FileNotFoundError, PermissionError и OSError. Это позволяет логировать ошибки и предотвращать аварийное завершение скрипта.
Использование pathlib для копирования файлов
Модуль pathlib обеспечивает объектно-ориентированный интерфейс для работы с файловой системой. Для копирования файлов удобно использовать комбинацию методов read_bytes() и write_bytes(), что позволяет создавать точные копии файлов без привлечения дополнительных модулей.
Пример базового копирования:
| Код | Описание |
|---|---|
| from pathlib import Path source = Path(«data/input.txt») destination = Path(«backup/input.txt») destination.write_bytes(source.read_bytes()) |
Чтение всех байтов исходного файла и запись в новый файл. Работает для любых типов файлов. |
Для проверки существования исходного файла и создания целевой директории используют методы exists() и mkdir(parents=True, exist_ok=True). Это предотвращает ошибки при записи в несуществующие папки.
Пример с проверкой:
| Код | Описание |
|---|---|
| destination.parent.mkdir(parents=True, exist_ok=True) if source.exists(): destination.write_bytes(source.read_bytes()) |
Создание всех промежуточных директорий и копирование файла только при наличии исходного. |
Использование pathlib удобно для кроссплатформенных скриптов, так как автоматически корректирует разделители путей и поддерживает работу с абсолютными и относительными путями.
Чтение и запись файлов через open для копирования
Функция open позволяет вручную управлять процессом копирования, что полезно при нестандартных сценариях, таких как фильтрация данных или обработка больших файлов по блокам. Основная стратегия – открытие исходного файла в режиме rb и целевого файла в режиме wb.
Базовый пример копирования:
- Открыть исходный файл: with open(«source.txt», «rb») as src
- Открыть целевой файл: with open(«destination.txt», «wb») as dst
- Прочитать данные и записать: dst.write(src.read())
Для больших файлов рекомендуется использовать копирование блоками, чтобы снизить нагрузку на память:
- Задайте размер блока, например, chunk_size = 1024 * 1024 (1 МБ)
- Чтение и запись выполняйте в цикле: while chunk := src.read(chunk_size): dst.write(chunk)
- После завершения файловые объекты автоматически закрываются через with
Проверка ошибок и логирование помогут избежать потери данных:
- Обрабатывать исключения FileNotFoundError и PermissionError
- Перед записью проверять свободное место и доступ к целевой директории
- Можно добавлять счетчики блоков для контроля процесса копирования больших файлов
Копирование больших файлов блоками данных

При работе с файлами размером десятки и сотни мегабайт или гигабайты стандартное чтение всего содержимого в память может вызвать перегрузку и замедление. Решение – копирование блоками фиксированного размера.
Алгоритм блокового копирования:
- Открыть исходный файл в режиме rb и целевой в режиме wb.
- Выбрать размер блока, например chunk_size = 4 * 1024 * 1024 для 4 МБ.
- Чтение и запись выполняются циклом: while chunk := src.read(chunk_size): dst.write(chunk).
- Закрытие файлов происходит автоматически при использовании конструкции with.
Преимущества метода:
- Снижение нагрузки на оперативную память.
- Контроль за прогрессом копирования, можно отслеживать количество обработанных блоков.
- Удобство при работе с сетевыми или внешними дисками, где скорость передачи данных ограничена.
Рекомендуется дополнительно проверять доступное место на диске и обрабатывать исключения OSError и PermissionError для предотвращения прерывания процесса копирования.
Перезапись существующих файлов при копировании
При копировании файлов часто возникает необходимость перезаписать уже существующие. В Python модули shutil и стандартные методы с open позволяют контролировать этот процесс.
С shutil:
- Методы copy и copy2 автоматически перезаписывают целевой файл, если он существует.
- Для пакетного копирования с copytree используется параметр dirs_exist_ok=True, позволяющий избежать ошибок при наличии директорий с одинаковым именем.
С использованием open перезапись выполняется открытием файла в режиме wb или ab:
- Режим wb удаляет старое содержимое и записывает новый файл.
- Режим ab добавляет данные в конец существующего файла без удаления.
Для безопасной перезаписи рекомендуется:
- Проверять существование целевого файла с помощью Path.exists() или os.path.exists().
- Создавать резервную копию перед заменой.
- Обрабатывать исключения PermissionError и OSError, чтобы избежать прерывания процесса.
Копирование файлов с сохранением метаданных
Сохранение метаданных важно при миграции файлов между системами, резервном копировании и синхронизации проектов. Метаданные включают время создания и изменения, права доступа и атрибуты файловой системы.
Модуль shutil предоставляет функцию copy2(src, dst), которая копирует файл вместе с метаданными. В отличие от copy, copy2 сохраняет все доступные атрибуты, включая дату изменения и права доступа.
Пример использования:
- Импортировать модуль: import shutil
- Вызвать копирование: shutil.copy2(«source.txt», «destination.txt»)
Для больших наборов файлов рекомендуется комбинировать copy2 с проверкой существования целевых директорий и обработкой исключений FileNotFoundError и PermissionError. Это обеспечивает корректное копирование и минимизирует риск потери метаданных.
Обработка ошибок при копировании файлов

Копирование файлов может завершиться неудачей из-за отсутствия исходного файла, недостаточных прав или нехватки места на диске. Python позволяет управлять этими ситуациями через конструкции try/except.
Наиболее часто встречающиеся исключения:
- FileNotFoundError – исходный файл или директория не найдены.
- PermissionError – недостаточно прав для чтения исходного файла или записи в целевую директорию.
Рекомендации по обработке:
- Ограничивать область try только кодом копирования, чтобы не перехватывать другие ошибки.
- Логировать ошибки с указанием пути исходного и целевого файлов.
- Использовать проверки перед копированием: os.path.exists() или Path.exists().
- При работе с большими файлами – обрабатывать исключения в цикле блокового копирования, чтобы не прерывать весь процесс.
- При критических ошибках создавать резервные копии уже скопированных файлов.
Вопрос-ответ:
Какие модули в Python подходят для копирования файлов?
В Python для копирования файлов чаще всего используют модуль shutil, который предоставляет функции copy, copy2 и copyfile. Модуль pathlib позволяет работать с объектами файловой системы и копировать файлы через методы read_bytes() и write_bytes(). Также можно использовать стандартное открытие файлов через open и запись содержимого вручную.
Как скопировать большой файл, не загружая его полностью в память?
Для больших файлов оптимально использовать блоковое копирование. Файл читают частями фиксированного размера, например 1–4 МБ, и записывают эти блоки в целевой файл. Такой подход снижает нагрузку на оперативную память и ускоряет работу скрипта при копировании видео, баз данных или архивов. Цикл с while chunk := src.read(chunk_size) позволяет пошагово обрабатывать файл.
Можно ли при копировании сохранять дату изменения и права доступа файла?
Да, модуль shutil предоставляет функцию copy2(src, dst), которая сохраняет метаданные исходного файла, включая дату изменения, права доступа и другие атрибуты. Это полезно при резервном копировании или переносе проектов между системами.
Как избежать ошибок при копировании файлов?
Для безопасного копирования рекомендуется проверять существование исходного файла и доступность целевой директории с помощью os.path.exists() или Path.exists(). Обрабатывать исключения FileNotFoundError, PermissionError и OSError. При работе с большими файлами блоковое копирование следует заключать в try/except, чтобы прерывание одного файла не останавливало процесс всей операции.
