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 (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:
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:
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:
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):
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
Can the source and destination be the same? Let's try and see.
It seems that this operation will bring us an error since the file names shouldn't be the same:
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
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
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
This can be simply done using the
copytree() function, as follows (assuming that everything is happening on the desktop):
import shutil shutil.copytree('Original', 'Original-Copy')
You should now find a new directory
Original-Copy with all the content and structure of
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:
import shutil shutil.move('Sample.pdf', 'Temp')
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?
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 no longer exists.
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
import shutil shutil.move('Original', 'Original-Copy')
In this case, you will have a new directory
Original-Copy with the same content as
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 will not find the deleted directory in your Trash.
The example below shows how we can permanently delete the
import shutil shutil.rmtree('Original-Copy')
import os os.remove('Sample.pdf')
As you can see, we were able to carry out important operations on files and directories—copy, move, rename, and delete—very easily through the shutil and os modules. You can consult the documentation of these modules for more information on what you can do with them.