Copy file in python example

Копирование файлов в Python

Когда дело доходит до использования Python для копирования файлов, есть два основных способа: использовать модуль shutil или модуль os. Все методы ОС, которые мы здесь показываем, являются методами, которые позволяют нам выполнять команды из нашего кода, который мы будем использовать для выполнения команды копирования (Windows) или команды cp (Unix).

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

С помощью модуля shutil

Модуль shutil предлагает несколько высокоуровневых методов копирования файлов. Вот основные из них:

copyfile

Этот метод копирует содержимое одного файла в другой. Предоставленное ему место назначения должно быть файлом с возможностью записи и иметь другое имя, чем исходный файл. Если имена совпадают, это вызовет ошибку. Если целевой файл уже существует, он будет заменен вновь скопированным файлом.

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

Например, следующий код скопирует файл с именем file1.txt в файл с именем file2.txt:

import shutil shutil.copyfile('file1.txt', 'file2.txt')

Одна интересная и потенциально полезная функция shutil.copyfile – логический аргумент follow_symlinks. Если установлено значение False и исходный файл является символической ссылкой, то вместо копирования файла будет создана новая символическая ссылка.

copy

Этот метод очень похож на copyfile, с основным отличием в том, что он не только копирует содержимое исходного файла, но и делает еще один шаг вперед, а также копирует разрешения файловой системы. Копирование прав доступа к файлам – нетривиальная задача для большинства языков программирования, так что это хорошая возможность.

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

Каждый из этих параметров такой же, как и в методе copyfile. Например, следующий код скопирует «file1.txt» в «file3.txt».

import shutil shutil.copy('file1.txt', 'file3.txt')

Примечание. Убедитесь, что вы не называете свой скрипт таким же, как один из модулей, которые вы импортируете (что я по ошибке сделал при тестировании кода для этой статьи). Если вы это сделаете, то при попытке импортировать этот модуль вы получите сообщение об ошибке из-за проблемы циклического импорта.

copy2

Как и предыдущие методы, метод copy2 идентичен методу копирования, но помимо копирования содержимого файла он также пытается сохранить все метаданные исходного файла. Если платформа не позволяет полностью сохранять метаданные, то copy2 не возвращает ошибку, а просто сохраняет любые метаданные, которые могут.

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

Опять же, эти параметры такие же, как и в предыдущих командах, которые мы уже упоминали.

Читайте также:  Birthday Reminders for August

Например, следующий код скопирует «file1.txt» в «file4.txt», а также сохранит метаданные исходного файла «file1.txt».

import shutil shutil.copy2('file1.txt', 'file4.txt')
$ python copy-files.py $ ls -l total 32 -rw-r--r-- 1 scott staff 91 Oct 27 11:26 copy-files.py -rw-r--r-- 1 scott staff 6 Oct 27 11:27 file1.txt -rw-r--r-- 1 scott staff 6 Oct 27 11:29 file3.txt -rw-r--r-- 1 scott staff 6 Oct 27 11:27 file4.txt

Как видно из выполнения нашего кода выше, «file1.txt» был скопирован в «file4.txt». Однако вы могли заметить, что дата создания была сохранена в новом файле, в отличие от shutil.copy, который копирует «file1.txt» в «file3.txt» и дает ему новую дату создания.

copyfileobj

Этот метод копирует содержимое исходного файла в целевой файл из текущей позиции исходного файла. Это означает, что если вы читаете данные из объекта исходного файла, то позиция, в которой вы прекращаете чтение, – это позиция, с которой copyfileobj начинает копирование.

shutil.copyfileobj(src_file_object, dest_file_object[, length])

Значения параметров исходного и целевого файлов аналогичны предыдущим командам, но теперь они относятся к объектам. Параметр длины является необязательным и представляет размер буфера, который представляет собой количество битов, хранящихся в памяти во время процесса копирования. Эта опция может быть полезна при копировании очень больших файлов, поскольку она может ускорить процесс копирования и избежать неконтролируемого использования памяти.

Например, следующий код скопирует “file1.txt” в “file5.txt”

import shutil filename1 = 'file1.txt' fileA = open(filename1, 'rb') filename2 = 'file5.txt' fileB = open(filename2, 'wb') shutil.copyfileobj(fileA, fileB)

Как мы видим, чтобы использовать copyfileobj, нам нужно открыть файлы в двоичном режиме (который является частью «b» от «rb» и «wb»). Кроме того, исходный файл должен быть открыт, как доступный для чтения, а целевой файл должен быть открыт, как доступный для записи (части «r» и «w» соответственно).

С помощью модуля os

Модуль os предоставляет возможность использовать функциональные возможности операционной системы для копирования ваших файлов. Мы приведем примеры, которые работают как для Windows, так и для Unix. Они различаются из-за используемых команд оболочки, поэтому не забудьте обратить внимание на то, как каждый вызов функции помечен в комментариях Python.

popen

Этот метод открывает канал к вашей команде. Однако обратите внимание, что этот метод устарел в Python 2.6, поэтому мы не рекомендуем его использовать, если в этом нет необходимости. В качестве альтернативы документация Python советует нам использовать вместо этого методы из модуля подпроцесса.

Здесь возвращаемое значение представляет собой файловый объект, подключенный к каналу. Этот объект может быть прочитан или записан в зависимости от режима. По умолчанию установлен режим «r», который позволяет читать содержимое файла.

В приведенном ниже примере файл file1.txt будет скопирован в file6.txt:

import os # Windows os.popen('copy file1.txt file6.txt') # Unix os.popen('cp file1.txt file6.txt')

Выполнение команды таким образом точно такое же, как если бы вы запускали ее непосредственно из командной строки вашего терминала.

Читайте также:  Python levenshtein не устанавливается

system

Этот метод выполняет указанную команду в подоболочке. Он доступен как для Unix, так и для Windows. Синтаксис следующий:

Здесь команда – это строка, содержащая команду оболочки DOS или Unix. В нашем случае сюда мы поместим команду copy или cp.

Например, следующий код скопирует file1.txt в file7.txt.

import os # Windows os.system('copy file1.txt file7.txt') # Unix os.system('cp file1.txt file7.txt')

Это выглядит идентично предыдущей команде os.popen, которую мы только что использовали, но команда выполняется в подоболочке, что означает, что она выполняется в отдельном потоке параллельно с вашим исполняемым кодом. Чтобы дождаться его завершения, вам нужно вызвать .wait() для объекта, возвращаемого os.system.

С помощью модуля subprocess

Модуль subprocess предназначен для замены некоторых методов в модуле os (в частности, методов os.system и os.spawn *), и он представляет два основных метода доступа к командам операционной системы. Это методы call и check_output. Еще раз, для систем Unix команду «copy file1.txt file2.txt» следует заменить на «cp file1.txt file2.txt».

call Method

Документация Python рекомендует нам использовать метод call для запуска команды из операционной системы.

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

Параметр args будет включать нашу команду оболочки. Однако небольшое предостережение, поскольку документация Python предупреждает нас, что использование shell = True может быть угрозой безопасности.

Используя этот вызов функции, мы можем запустить нашу команду копирования следующим образом:

import subprocess # Windows status = subprocess.call('copy file1.txt file8.txt', shell=True) # Unix status = subprocess.call('cp file1.txt file8.txt', shell=True)

Как показывает пример выше, нам просто нужно передать строку с помощью команды оболочки, как и раньше.

Как и ожидалось, операционная система скопирует file1.txt в файл с именем file8.txt.

Метод check_output

Этот метод также позволяет нам выполнять команду в оболочке. Это очень похоже на команду subprocess.run, за исключением того, что по умолчанию она передает данные из stdout в виде закодированных байтов. Синтаксис следующий:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

Здесь параметр args включает команду оболочки, которую мы хотим использовать. Еще раз, документация Python предупреждает нас об использовании shell = True, поэтому используйте этот метод с осторожностью.

В следующем коде мы скопируем «file1.txt» в «file9.txt» с помощью команды check_output:

import subprocess # Windows status = subprocess.check_output('copy file1.txt file9.txt', shell=True) # Unix status = subprocess.check_output('cp file1.txt file9.txt', shell=True)

И, как и все команды, которые мы показали в этой статье, это скопирует файл «file1.txt» в указанное нами место назначения.

Заключение

Python предлагает нам множество различных способов копирования файлов, некоторые из которых являются частью набора методов. Другие используют некоторые мощные методы для выполнения команд в оболочке, которые используют команды copy или cp.

Читайте также:  Goto top in php

Источник

How to Copy a File using Python (examples included)

Data to Fish

In this short guide, you’ll see how to copy a file, from one folder to another, using Python.

To start, here is a template that you may use to copy a file in Python using shutil.copyfile:

import shutil original = r'original path where the file is currently stored\file name.file extension' target = r'target path where the file will be copied\file name.file extension' shutil.copyfile(original, target)

Let’s now see the steps to apply the above template in practice.

Steps to Copy a File using Python

Step 1: Capture the original path

To begin, capture the path where your file is currently stored.

For example, let’s suppose that a CSV file is stored in a folder called Test_ 1 :

Where the CSV file name is ‘products‘ and the file extension is csv.

Step 2: Capture the target path

Next, capture the target path where you’d like to copy the file.

For our example, the file will be copied into a folder called Test_ 2 :

Step 3: Copy the file in Python using shutil.copyfile

For the final step, use the following template to copy your file:

import shutil original = r'original path where the file is currently stored\file name.file extension' target = r'target path where the file will be copied\file name.file extension' shutil.copyfile(original, target)

Make sure to place the ‘r‘ character before your paths to avoid the following error:

SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape

In the context of our example, the complete code would look like this:

import shutil original = r'C:\Users\Ron\Desktop\Test_1\products.csv' target = r'C:\Users\Ron\Desktop\Test_2\products.csv' shutil.copyfile(original, target)

If you run the code in Python (adjusted to your paths), you’ll see that the ‘products‘ CSV file would be copied into the Test_2 folder.

Alternatively, you may copy a file with a new name.

For instance, let’s copy the original CSV file (with the file name of ‘products‘) to the new location with a new file name (‘new_products‘):

import shutil original = r'C:\Users\Ron\Desktop\Test_1\products.csv' target = r'C:\Users\Ron\Desktop\Test_2\new_products.csv' shutil.copyfile(original, target)

The new file name (called ‘new_products‘) would then be copied into the target location (the Test_2 folder).

The same principles would apply for other file types. For instance, let’s suppose that a JPG file called ‘image‘ is stored in the Test_1 folder.

The following code can then be used to copy the image to the Test_2 folder:

import shutil original = r'C:\Users\Ron\Desktop\Test_1\image.jpg' target = r'C:\Users\Ron\Desktop\Test_2\image.jpg' shutil.copyfile(original, target)

The JPG file should now appear in the Test_2 folder.

Источник

Оцените статью