How to copy file without overwriting destination file using Python shutil
Purpose
In this post, I will demonstrate how to copy files using Python’s shutil module, and how to copy files without overwriting the destination file.
The Environment
- Python 3
- Shutil
The code
How to copy a file?
This is a demo that shows how to copy a file from src to dest:
import os,sys,shutil
def copy_file(src_path, src_file_name, dest_path, dest_file_name): # construct the src path and file name src_path_file_name = os.path.join(src_path, src_file_name)
# construct the dest path and file name dest_path_file_name = os.path.join(dest_path, dest_file_name)
# do the real job shutil.copyfile(src_path_file_name, dest_path_file_name) print("copy from %s to %s ok" % (src_path_file_name,dest_path_file_name)) pass
if __name__ == '__main__': src_path = sys.argv[1] src_file_name = sys.argv[2] dest_path = sys.argv[3] dest_file_name = sys.argv[4]
copy_file(src_path,src_file_name,dest_path,dest_file_name)Test the copy function
Suppose our working directory structure is as follows:
.└── working_directory/ ├── copy_file_demo.py ├── logo.png └── images/ └── readme.txtNow we want to copy logo.png to the images directory and name it logo_bak.png. We can do this as follows:
$ python copy_file_demo.py . logo.png images logo_bak.pngcopy from ./logo.png to images/logo_bak.png okAfter running the above command, we get this directory structure:
.└── working_directory/ ├── copy_file_demo.py ├── logo.png └── images/ ├── readme.txt └── logo_bak.pngHow to copy without overwriting
The code:
def copy_file_without_overwrite(src_path, src_file_name, dest_path, dest_file_name): # construct the src path and file name src_path_file_name = os.path.join(src_path, src_file_name)
# construct the dest path and file name dest_path_file_name = os.path.join(dest_path, dest_file_name)
# test if the dest file exists, if false, do the copy, or else abort the copy operation. if not os.path.exists(dest_path_file_name): shutil.copyfile(src_path_file_name, dest_path_file_name) print("copy from %s to %s ok" % (src_path_file_name, dest_path_file_name)) else: print("already exist %s, copy aborted"%dest_path_file_name)
passTest the copy again
Our directory structure is:
.└── working_directory/ ├── copy_file_demo.py ├── logo.png └── images/ ├── readme.txt └── logo_bak.pngThen we execute the following command in the working directory:
$ python copy_file_demo.py . logo.png images logo_bak.pngalready exist images/logo.png, copy abortedIt works!
About the shutil
Shutil module in Python provides many high-level operations on files and collections of files. This module helps in automating the process of copying and removal of files and directories. The shutil.copy() method in Python is used to copy the content of the source file to the destination file or directory.
Shutil is the abbreviation of shell utility, which implements advanced functions such as file copying, moving, compression, and decompression in Python. It is a Python system module and does not require additional installation.
The commonly used functions in shutil are listed below:
shutil.copyfile(src, dst): Copy from sourcesrctodst. If the destination file already exists, it will be overwritten.shutil.move(src, dst): Move a file or rename it.shutil.copymode(src, dst): Copy file permissions, but not the file content.shutil.copystat(src, dst): Copy file permissions, last access time, and last modification time.shutil.copy(src, dst): Copy a file to a file or a directory.shutil.copy2(src, dst): Similar toshutil.copy(), but also copies the last access time and modification time.shutil.copytree(olddir, newdir, True/False): Copy a directory tree. If the third parameter isTrue, symbolic links are preserved.shutil.rmtree(src): Recursively delete a directory and all its contents.
Summary
In this post, we demonstrated how to use the shutil module in Python to copy files from one location to another. We also showed how to avoid overwriting the destination file during the copy operation. The shutil module is a powerful tool for file operations in Python, and it simplifies tasks like copying, moving, and deleting files and directories.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!