Python shutil.copyfile() — это встроенный метод, который используется для копирования содержимого исходного файла в целевой файл. Модуль shutil Python предоставляет множество функций высокоуровневых операций над файлами и коллекциями файлов. Он входит в стандартные служебные модули Python и помогает автоматизировать процесс копирования и удаления файлов и каталогов.
- Что такое функция copyfile() в Python?
- Синтаксис
- Параметры
- Пошаговое копирование файла в Python
- Шаг 1: Перейдите в папку, где находится ваш файл src
- Шаг 2: Получите путь dst (назначение)
- Шаг 3: Просмотр содержимого пути dst
- Шаг 4: Напишите код для копирования файла на Python
- Возможные ошибки при копировании файла
- SameFileError
- IsADirectoryError
- Обработка ошибок при использовании метода shutil.copyfile()
- Заключение
Что такое функция copyfile() в Python?
Функция Python shutil.copyfile() копирует содержимое (без метаданных) файла с именем src в файл с именем dst наиболее эффективным способом.
src и dst — это path-like объекты или имена пути, заданные в виде строк. Файл dst должен быть полным именем целевого файла; посмотрите на copy() для копии, которая принимает путь к целевому каталогу. Если src и dst указывают один и тот же файл, возникает ошибка SameFileError. Пункт назначения должен быть доступен для записи; в противном случае будет возбуждено исключение OSError. Если файл dst уже существует в этом месте, он будет заменен.
Отдельные файлы, такие как символьные или блочные устройства и конвейеры, не могут быть скопированы с помощью функции copyfile().
Если для параметра follow_symlinks установлено значение false, а src является символической ссылкой, вместо копирования файла, на который указывает src, будет создана новая символическая ссылка.
Синтаксис
|
1 |
shutil.copyfile(src, dst) |
Параметры
- Параметр src — это путь к исходному файлу, который необходимо скопировать.
- Параметр dst — это путь к файлу назначения, куда файл копируется и помещается в нужное место.
Пошаговое копирование файла в Python
Теперь мы выполним несколько простых шагов, чтобы скопировать файл в Python 3.
Шаг 1: Перейдите в папку, где находится ваш файл src
Перейдите к файлу src, откройте терминал и введите следующую команду, чтобы получить полный путь.
|
1 |
pwd |
Выход:
|
1 2 |
➜ test pwd /Users/krunal/Desktop/code/pyt/test |
Итак, я в папке файла src. Теперь давайте узнаем содержимое текущей папки с помощью следующей команды.
|
1 |
ls |
Команда выведет список файлов и каталогов внутри текущей папки.
Выход:
|
1 2 3 |
➜ test ls app.py platform index.py server-22-Apr-2020.py |
Итак, у нас есть три файла и одна папка. Мы должны скопировать файл app.py и поместить его в папку платформы.
Это означает, что наш путь к файлу src следующий.
|
1 |
/Users/krunal/Desktop/code/pyt/test/app.py |
Шаг 2: Получите путь dst (назначение)
Наш путь к файлу назначения или путь dst находится внутри папки платформы. Итак, давайте зайдем в папку платформы.
|
1 |
cd platform |
Теперь получите полный путь к папке платформы, используя следующую команду.
|
1 |
pwd |
Выход:
|
1 2 |
➜ platform pwd /Users/krunal/Desktop/code/pyt/test/platform |
Наша папка dst — это platform. Но наш dst-файл будет другим. Это новая копия файла app.py.
Теперь давайте установим имя скопированного файла cp.py.
Итак, наш путь к файлу dst следующий.
|
1 |
/Users/krunal/Desktop/code/pyt/test/platform/cp.py |
Теперь у нас есть два полных пути.
- src
- dst
Это все, что нам нужно, чтобы скопировать файл в Python.
Шаг 3: Просмотр содержимого пути dst
Итак, давайте посмотрим на файлы внутри папки платформы.
|
1 2 3 |
➜ platform ls 1.py ➜ platform |
Это означает, что у нас есть только один файл в папке платформы с именем 1.py. После копирования файла у нас в папке будет два файла: 1.py и другой скопированный файл.
Шаг 4: Напишите код для копирования файла на Python
Теперь, когда у нас есть пути src и dst, мы можем написать код для копирования файла.
Напишите следующий код в файле index.py.
|
1 2 3 4 5 6 7 8 9 |
# index.py import shutil src = '/Users/krunal/Desktop/code/pyt/test/app.py' dst = '/Users/krunal/Desktop/code/pyt/test/platform/cp.py' shutil.copyfile(src, dst) print('The file is successfully copied') |
Выход:
|
1 2 |
➜ test python3 index.py The file is successfully copied |
Теперь зайдите в папку платформы.
|
1 2 |
➜ test cd platform ➜ platform |
Перечислите имена файлов, используя следующую команду.
|
1 2 3 |
➜ platform ls 1.py cp.py ➜ platform |
Итак, наш файл скопирован, и теперь этот файл называется cp.py. Если вы не хотите заходить в папку платформы вручную, то мы можем использовать функцию os.listdir().
Функция Python os.listdir() указывает путь к папке назначения и отображает ее содержимое.
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 |
# index.py import shutil import os src = '/Users/krunal/Desktop/code/pyt/test/app.py' dst = '/Users/krunal/Desktop/code/pyt/test/platform/cp.py' shutil.copyfile(src, dst) print(os.listdir('/Users/krunal/Desktop/code/pyt/test/platform')) |
Выход:
|
1 2 |
python3 index.py ['cp.py', '1.py'] |
Возможные ошибки при копировании файла
Если источник и место назначения представлены, будет возбуждено исключение «SameFileError» для одного и того же файла.
SameFileError
|
1 2 3 4 5 6 7 8 9 10 |
# index.py import shutil import os src = '/Users/krunal/Desktop/code/pyt/test/app.py' dst = '/Users/krunal/Desktop/code/pyt/test/app.py' shutil.copyfile(src, dst) print(os.listdir('/Users/krunal/Desktop/code/pyt/test/platform')) |
Выход:
|
1 2 3 4 5 6 7 8 |
➜ test python3 index.py Traceback(most recent call last): File "index.py", line 7, in <module> shutil.copyfile(src, dst) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/shutil.py", line 104, in copyfile raise SameFileError("{!r} and {!r} are the same file".format(src, dst)) shutil.SameFileError: '/Users/krunal/Desktop/code/pyt/test/app.py' and '/Users/krunal/Desktop/code/pyt/test/app.py' are the same file ➜ test |
Если пунктом назначения является каталог, будет вызвано исключение «IsADirectoryError».
IsADirectoryError
|
1 2 3 4 5 6 7 8 9 10 |
# app.py import shutil import os src = '/Users/krunal/Desktop/code/pyt/test/app.py' dst = '/Users/krunal/Desktop/code/pyt/test' shutil.copyfile(src, dst) print(os.listdir('/Users/krunal/Desktop/code/pyt/test/platform')) |
Выход:
|
1 2 3 4 5 6 7 8 |
➜ test python3 index.py Traceback(most recent call last): File "index.py", line 7, in <module> shutil.copyfile(src, dst) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/shutil.py", line 121, in copyfile with open(dst, 'wb') as fdst: IsADirectoryError: [Errno 21] Is a directory: '/Users/krunal/Desktop/code/pyt/test' ➜ test |
Если место назначения недоступно для записи, будет применено исключение «PermissionError».
Обработка ошибок при использовании метода shutil.copyfile()
Обработка исключений — это мощный механизм обработки ошибок, не нарушающий работу программы.
Давайте воспользуемся механизмом try-except Python для обработки исключений.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# index.py import shutil import os src = '/Users/krunal/Desktop/code/pyt/test/app.py' dst = '/Users/krunal/Desktop/code/pyt/test' try: shutil.copyfile(src, dst) print(os.listdir('/Users/krunal/Desktop/code/pyt/test/platform')) except shutil.SameFileError: print("Error: Source and destination represents the same file.") # If destination is a directory. except IsADirectoryError: print("Error: Destination is a directory.") # If there is any permission issue except PermissionError: print("Error: Permission denied.") # For other errors except: print("Error occurred while copying file.") |
Выход:
|
1 2 3 |
➜ test python3 index.py Error: Destination is a directory. ➜ test |
Заключение

В этом руководстве мы увидели, как выбрать исходный и целевой пути и использовать функцию Shutil.copyfile() для копирования файла в Python. Мы увидели, какие возможные исключения могут возникнуть во время работы программы и как обрабатывать эти исключения и поддерживать работу программы.
