os.listdir function. This is only an example of recursion in Python, however not the most effective method to traverse a directory in Python. The built-in Python function os.walk is the most “Pythonic” method. For a quick look at how to use os.walk, checkout this article for a quick os.walk example. If you are after a more in-depth look at os.walk, be sure to checkout the article Python’s os.walk: An In-depth GuideSo. What’s better than making a list of video files on your hard disc drive?
Let’s make a list of all video files in a folder, and all other folders in it!
What is a Recursive Python Function?
Recursion is a concept in computer science. Essentially, it divides a problem into sub-problems. Recursion in Python generally relates to a specific function, method or object, which calls itself to break up these problems. For example, a factorial function would be as follows:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
Note that the factorial function calls itself, to break down the factorial problem into sub-problems.
Recursive Python Function Overview
After writing the code, save the file with a .py extension, for example movie_list_maker.py. Then put the file in a directory where you’ve got your movie files (and other files, as well). The code in the script will recursively traverse (look in) all other folders within it, and check for video files. If you’re using Windows and have Python IDLE installed, you can just double-click on the file and check the output. If you’re on Linux or Mac, open a terminal and cd into the directory where your script is, then open the script typing ./movie_list_maker.py in your terminal (make sure the file is executable first).
Recursive Python Function: Let’s Code!
Let’s write the code of traversal within a function, which looks like:
import os
def processFile(currentDir):
''' Process video files within this directory. '''
# Get the absolute path of the currentDir parameter
currentDir = os.path.abspath(currentDir)
# Get a list of files in currentDir
filesInCurDir = os.listdir(currentDir)
# Traverse through all files
for file in filesInCurDir:
curFile = os.path.join(currentDir, file)
# Check if it's a normal file or directory
if os.path.isfile(curFile):
# Get the file extension
curFileExtension = curFile[-3:]
# Check if the file has an extension of typical video files
if curFileExtension in ['avi', 'dat', 'mp4', 'mkv', 'vob']:
# We have got a video file! Increment the counter
processFile.counter += 1
# Print it's name
print('\n%s' % curFile)
else:
# We got a directory, enter into it for further processing
processFile(curFile)
The code is pretty much self-explanatory along with the comments. This recursive Python function takes one argument: the name of a directory to work on. Then it gets a list of all files and folders in this directory using the os.listdir method. We use a for loop to work on the list, check whether the file variable is a normal file or a directory using the os.path.isfile method. If it’s a normal file, we get the extension of the file using: curfile[-3:] – we assume that last three characters of the filename is it’s extension, so we’ve used a negative sign while slicing the curfile variable. For more information on slicing strings, checkout the article on cutting and slicing strings in Python.
If the filename is a directory other than a regular file, we recursively call the function itself to further process it.
Calling the Recursive Python Function
Now, we call this function within the __main__ scope:
import os
if __name__ == '__main__':
# Get the current working directory
currentDir = os.getcwd()
print('Starting processing in %s' % currentDir)
# Set the number of processed files equal to zero
processFile.counter = 0
# Start Processing
processFile(currentDir)
# We are done. Exit now.
print('\n -- %s Movie File(s) found in directory %s --' \
% (processFile.counter, currentDir))
print('\n Press ENTER to exit!')
# Wait until the user presses enter/return
input()
import os
if __name__ == '__main__':
# Get the current working directory
currentDir = os.getcwd()
print('Starting processing in %s' % currentDir)
# Set the number of processed files equal to zero
processFile.counter = 0
# Start Processing
processFile(currentDir)
# We are done. Exit now.
print('\n -- %s Movie File(s) found in directory %s --' \
% (processFile.counter, currentDir))
print('\n Press ENTER to exit!')
# Wait until the user presses enter/return
raw_input()
Once again, the os.getcwd method helps us to get the current working directory (cwd), i.e. the directory where the script resides. It calls our just-written function and also has a counter, it counts how many video files it found. Finally, we print all information we have, and wait for a prompt from user to terminate the program using the input or raw_input method (Python changed the name of the raw_input method to input when going from Python 2 to Python 3).
Pingback: Recursive File and Directory Manipulation in Python (Part 1) - Python Central