Как копировать файл с помощью модуля `shutil`?

Для копирования файла с помощью модуля shutil можно использовать функции:

  • shutil.copy(src, dst) - копирует содержимое файла src в файл или директорию dst. Копирует также биты прав доступа.
  • shutil.copy2(src, dst) - аналогична shutil.copy(), но также пытается сохранить метаданные файла (время последнего доступа и модификации).
  • shutil.copyfile(src, dst) - копирует только содержимое файла src в файл dst. Поднимает исключение, если dst уже существует.

Например:

import shutil

# Копирование файла с сохранением метаданных
shutil.copy2('source.txt', 'destination.txt')

# Копирование файла с новым именем
shutil.copy('source.txt', 'new_directory/new_file.txt')

Модуль shutil в Python предоставляет несколько функций для копирования файлов. Вот наиболее распространенные способы:

1. shutil.copy(src, dst):

Копирует файл src в местоположение dst. Если dst - файл, он будет перезаписан. Если dst - директория, файл src будет скопирован в эту директорию с тем же именем. Эта функция копирует только содержимое файла и права доступа. Метаданные, такие как время создания/изменения, не копируются.

import shutil

src = 'source_file.txt'
dst = 'destination_file.txt'

shutil.copy(src, dst) # Копирует source_file.txt в destination_file.txt

dst_dir = 'destination_directory' # Должна существовать
shutil.copy(src, dst_dir) # Копирует source_file.txt в destination_directory/source_file.txt
  

2. shutil.copy2(src, dst):

Работает аналогично shutil.copy(), но также пытается сохранить все метаданные, включая время доступа и изменения файла. Если это невозможно (например, из-за ограничений прав доступа), копирование метаданных будет проигнорировано.

import shutil

src = 'source_file.txt'
dst = 'destination_file.txt'

shutil.copy2(src, dst) # Копирует source_file.txt в destination_file.txt и сохраняет метаданные
  

3. shutil.copyfile(src, dst):

Копирует только содержимое файла src в файл dst. dst должен быть файлом, а не директорией. Права доступа не копируются.

import shutil

src = 'source_file.txt'
dst = 'destination_file.txt'

shutil.copyfile(src, dst) # Копирует содержимое source_file.txt в destination_file.txt
  

Важно:

  • Убедитесь, что целевая директория существует, иначе shutil.copy() и shutil.copy2() могут выдать ошибку. Для создания директорий используйте os.makedirs().
  • Обрабатывайте исключения IOError и OSError, которые могут возникнуть при копировании файлов (например, из-за недостаточных прав доступа или отсутствия файла).
  • Для копирования иерархии каталогов используйте shutil.copytree().
  • Все эти функции поддерживают работу с путями, представленными в виде строк или объектов pathlib.Path.

Пример обработки исключений:

import shutil
import os

src = 'source_file.txt'
dst = 'destination_directory/destination_file.txt'

try:
  os.makedirs(os.path.dirname(dst), exist_ok=True)  # Создаем директорию, если она не существует
  shutil.copy2(src, dst)
  print(f"Файл {src} успешно скопирован в {dst}")
except FileNotFoundError:
  print(f"Файл {src} не найден.")
except PermissionError:
  print(f"Нет прав для копирования файла {src} в {dst}.")
except OSError as e:
  print(f"Ошибка при копировании файла: {e}")
except Exception as e:
  print(f"Неизвестная ошибка: {e}")
0