In this tutorial, you’ll learn how to use Python to copy a file using the built-in shutil
library. You’ll learn a total of four different ways to copy, depending on what your needs are. You’ll learn how to copy a file to a direct path, to a directory, include metadata, and copy permissions of the file.
Knowing how to copy a file is an important skill that allows you to, for example, create a backup of a file before modifying it using your script.
The Quick Answer: Use shutil
Table of Contents
Overview of Shutil Copy Methods
The shutil
library provides a number of different copy methods, each of which copy files, but do so slightly differently. The table below provides a helpful overview of these different copy methods, allowing you to choose the method that’s best suited for your purpose.
The sections that follow go deeper into the different methods, providing step-by-step instructions with easy to follow examples.
Function | Include File Metadata | Requires File Destination | Copies the File Object |
---|---|---|---|
.copy() | x | ✓ | x |
.copyfile() | x | x | x |
.copy2() | ✓ | ✓ | x |
.copyfileobj() | x | x | ✓ |
In the next section, you’ll learn how to copy a file with Python to a particular path.
Want to learn how to get a file’s extension in Python? This tutorial will teach you how to use the os and pathlib libraries to do just that!
Copy a File with Python to a Particular Path
The shutil.copyfile()
method copies a file to another destination file path, meaning that we need to specify not just the destination directory (folder), but also the filename and extension we want to use. This can be very helpful if you want to move and rename the file you’re copying.
Let’s take a look at how we can use the shutil.copyfile()
method to copy a file using Python:
# Copy a file to a destination with shutil.copyfile()
import shutil
shutil.copyfile('/Users/datagy/Desktop/file.py', '/Users/datagy/Desktop/file2.py')
Some things to make note of here:
- Both the source and destination file paths must be entire file paths, rather than just directories
- If a file already exists in its destination, it will be replaced
- Metadata will not be copied over
In the next section, you’ll learn how to use Python to copy a file to a particular directory using the
Need to automate renaming files? Check out this in-depth guide on using pathlib to rename files. More of a visual learner, the entire tutorial is also available as a video in the post!
Copy a File with Python to a Particular Directory
If you simply want to copy a file to a destination folder without specifying a filename for it, you can use the shutil.copy()
method. The method allows you to specify a destination file path or directory. This can be helpful when you simply want to copy multiple files to a given destination.
Let’s take a look at how we can copy a file to a directory using shutil.copy()
:
# Copy a file to a destination with shutil.copy()
import shutil
shutil.copy('/Users/datagy/Desktop/file.py', '/Users/datagy/Desktop/Folder/')
Some additional things to make note of:
- The source must be a complete file path, but the destination can be either a file path or a directory path
- If a file already exists in the destination, the file will be replaced
- No metadata is copied over
In the next section, you’ll learn how to copy a file and preserve metadata with Python.
Want to learn more about Python list comprehensions? Check out this in-depth tutorial that covers off everything you need to know, with hands-on examples. More of a visual learner, check out my YouTube tutorial here.
Copy a File with Metadata in Python
By default, the above methods don’t copy the metadata of the data. This, for example, can contain the created date. If this is important, you can use the shutil.copy2()
method.
Let’s see how we can do this:
# Copy a file to a destination with shutil.copy2() with metadata
import shutil
shutil.copy('/Users/datagy/Desktop/file.py', '/Users/datagy/Desktop/Folder/')
Let’s take a look at some additional notes on this method:
- The source must be a full file path, but the destination can be either a file path or a directory
- Meta data will be preserved
- If a file already exists in the destination, it will be overwritten
In the next section, you’ll learn how to copy an entire file object using Python.
Check out some other Python tutorials on datagy, including our complete guide to styling Pandas and our comprehensive overview of Pivot Tables in Pandas!
Copy a File with Python as a File Object
You can also copy a file as a file object by using the shutil.copyfileobj()
method. This method, instead of taking file paths, takes file-like objects as its arguments.
Because of this, we need to first open the file to copy it successfully.
Let’s see how we can do this:
# Copy a file to a destination with shutil.copyfileobj()
import shutil
source_file_path = '/Users/nikpi/Desktop/file.py'
source_file = open(source_file_path, 'rb')
destination_file_path = '/Users/nikpi/Desktop/file.py'
destination_file = open(source_file_path, 'wb')
shutil.copyfileobj(source_file, destination_file)
Want to learn more about Python for-loops? Check out my in-depth tutorial that takes your from beginner to advanced for-loops user! Want to watch a video instead? Check out my YouTube tutorial here.
Conclusion
In this post, you learned four different ways to copy a file in Python using the shutil
library. Knowing the advantages and implications of the different approaches can make you get the results you really wanted. Copying files programatically can be an incredibly helpful skill to leverage the advantages of programming, especially when you’re dealing with hundreds of files.
To learn more about the shutil
library, check out the official documentation here.
Pingback: Python: Check if a File or Directory Exists • datagy
Pingback: Python: Get and Change the Working Directory • datagy
There is an error in the “Copy a File with Metadata in Python” section.
Original Code
# Copy a file to a destination with shutil.copy2() with metadata
import shutil
shutil.copy(‘/Users/datagy/Desktop/file.py’, ‘/Users/datagy/Desktop/Folder/’)
Corrected Code
# Copy a file to a destination with shutil.copy2() with metadata
import shutil
shutil.copy2(‘/Users/datagy/Desktop/file.py’, ‘/Users/datagy/Desktop/Folder/’)