Skip to content

How to copy files in Python

Learn how to leverage the shutil package to copy files in python.


Python is widely used as an automation tool and one of the major automation tasks is copying files from a source to a destination.

Many would find the os library synonymous with such tasks but it’s surprising that os doesn’t provide support for copying or moving files.

In this article, we are going to see how we can use the shutil module to help us move files from one path to another.

About shutil

Shutil is amongst built-in modules of python. It provides access to some high-level operations such as changing ownership of files, using which command and operations pertaining to files such as copying, moving, archiving, and removal.

There are four ways to copy files in shutil:

1. shutil.copy(src, dest)

This function takes in two arguments, the source file path and the destination path, both must be a string or bytes object. Source must be a file name with the path, and the destination can be a file path or a directory. If the file name in source and destination is different then the source file will be copied to a new file with specified name. Using copy() preserves file permissions but loses its metadata. Here's an example:

import shutil

shutil.copy("/Desktop/notes.txt", "/Documents/class_notes.txt") # file will be renamed
shutil.copy("/Desktop/notes.txt", "/Documents/") # file will be copied with same name

2. shutil.copyfile(src, dest)

copyfile() is same as copy() with a few differences. Destination path can not be a directory, it must be a path to new file. Metadata and permissions are not preserved.

import shutil

shutil.copyfile("/Desktop/notes.txt", "/Documents/class_notes.txt") # file will be renamed

3. shutil.copyfileobj(src_obj, dest_obj)

In cases where file-like objects are required to be copied, copyfileobj() can be used. Here, source and destination are both file objects. Metadata and permissions are not preserved. Let's see the usage:

import shutil

src_obj = open("/Desktop/notes.txt", "r")
dest_obj = open("/Documents/notes.txt", "w") # file name can be different

shutil.copyfileobj(src_obj, dest_obj)

src_obj.close()
dest_obj.close()

4. shutil.copy2(src, dest)

copy2() is identical to copy() except that copy2() preserves metadata.

import shutil

shutil.copy2("/Desktop/notes.txt", "/user/Documents/class_notes.txt")
shutil.copy2("/Desktop/notes.txt", "/user/Documents/")

FREE VS Code / PyCharm Extensions I Use

✅ Write cleaner code with Sourcery, instant refactoring suggestions: Link*


PySaaS: The Pure Python SaaS Starter Kit

🚀 Build a software business faster with pure Python: Link*

* These are affiliate link. By clicking on it you will not have any additional costs. Instead, you will support my project. Thank you! 🙏