In a previous tutorial, I discussed how we can read, open, close, and write to files. In this tutorial, I will go further and discuss different operations we can perform on files and directories (folders).
You know, for instance, we use files a lot, and working with files goes beyond just opening and closing the file. Do you remember how many times you copied that specific file? Oh, or when you renamed the file you downloaded from some website because it had a meaningless name? Those are some types of operations I'm going to discuss in this tutorial.
Ready? Let's then get to the point and start doing interesting stuff with our files and directories using Python!
shutil
shutil
(Shell Utilities) is the name of the module we will be using in this tutorial to carry out different file and directory operations. shutil
already comes with your Python installation, so you don't need to manually install it. In order to make use of this module, all you need to do is import
the module:import shutil
Copying Files
Let's start with our first operation, that is, copying files. To do that, we will be using the
copy()
function from the shutil
module. I'm going to use the file sample.pdf in this tutorial's examples. You can feel free to download this file or use any file you like.
The following simple script will show you how to copy
sample.pdf
from the desktop (where it is originally located) to another directory Temp
, which is also located on the desktop:
1
2
| import shutil shutil.copy( 'sample.pdf' , 'Temp' ) |
Notice that I have only listed the file name and the directory name, since I'm working with my Terminal with the desktop being the path I'm using. You can instead specify the full path to both the file you want to copy and the directory you want to copy the file to, which in my case is as follows:
1
| shutil.copy( '/Users/Abder/Desktop/sample.pdf' , '/Users/Abder/Desktop/Temp' ) |
Go ahead, open the
Temp
directory, or any directory you specified, and you should find the copied file there!
What if the second argument was a file instead of a directory? In other words, let's say you typed the following (I removed the full path to the files, assuming they are both on the desktop):
1
2
| import shutil shutil.copy( 'sample.pdf' , 'file.pdf' ) |
In this case, you will have a new file
file.pdf
, which is a copy of the original file sample.pdf
. Thus, if you open file.pdf
, you will notice that it has the same content because it is actually a copy of sample.pdf
.
Can the source and destination be the same? Let's try and see.
shutil.copy('sample.pdf', 'sample.pdf'
)
It seems that this operation will bring us an error since the file names shouldn't be the same:
1
2
3
4
5
6
7
8
| Traceback (most recent call last): File "test.py" , line 2 , in <module> shutil.copy( 'sample.pdf' , 'sample.pdf' ) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py" , line 119 , in copy copyfile(src, dst) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py" , line 69 , in copyfile raise Error( "`%s` and `%s` are the same file" % (src, dst)) shutil.Error: `sample.pdf` and `sample.pdf` are the same file |
Copying Directories
In this section, we are going to see how we can copy a whole directory (folder) rather than a single file, as we saw in the previous section.
Let's say we have the following directory structure which we want to copy. That is, we have a main directory
Original
, which contains a directory Original-1
, which contains the directory Original-2
, and which contains the directory Original-3
, and in Original-3
we have our file Sample.pdf
(phew...).
What we want to do now is to copy the directory
Original
with all its contents to a new directory, and call that new directory Original-Copy
.
This can be simply done using the
copytree()
function, as follows (assuming that everything is happening on the desktop):
1
2
| import shutil shutil.copytree( 'Original' , 'Original-Copy' ) |
You should now find a new directory
Original-Copy
with all the content and structure of Original
.Moving Files
Moving a file is like making a cut-paste operation on the file. In the Copying Files section we saw how to make a copy of a file, while keeping the original file in its original location.
In this section, we will see how to move (cut) the file to a new location, while removing it at the same time from its original location. This operation is simply carried out using the
move()
function, as follows:
1
2
| import shutil shutil.move( 'Sample.pdf' , 'Temp' ) |
Notice that
Sample.pdf
has been moved to the directory Temp
, and no longer exists on the desktop.
What if we moved
Sample.pdf
to a new file New-Sample.pdf
, as follows?
1
2
| import shutil shutil.move( 'Sample.pdf' , 'New-Sample.pdf' ) |
In this case, you will only have
New-Sample.pdf
with the same content as Sample.pdf
, but Sample.pdf
no longer exists.Moving Directories
Moving directories is carried out using the same function we used in the Moving Files section, that is
move()
. Let's use the same example as in the Copying Directories section, but now with the move()
function.
1
2
| import shutil shutil.move( 'Original' , 'Original-Copy' ) |
In this case, you will have a new directory
Original-Copy
with the same content as Original
, but Original
no longer exists.Renaming Files and Directories
Guess what? You can also use the
move()
function to rename a file or directory. I will not repeat the examples again in this section. But, if you noticed when applying the move()
function on both files and directories above, we mentioned that the original file/directory no longer exists, but a new file/directory with the same content does exist. This is like renaming a file/directory, isn't it?Deleting Files and Directories
It seems that the
shutil
module does not contain a function for deleting files. It does, however, contain a function for deleting directories: rmtree()
. Be careful because the deletion is permanent, and thus you willnot find the deleted directory in your Trash.
The example below shows how we can permanently delete the
Original-Copy
directory:
1
2
| import shutil shutil.rmtree( 'Original-Copy' ) |
If you want to permanently delete a file, you can use the
remove()
function from Python's os
module, as follows:
1
2
| import os os.remove( 'Sample.pdf' ) |