In an earlier post "OS.walk in Python", I described how to use os.walk and showed some examples on how to use it in scripts. In this article, I will show how to use the os.walk() module function to walk a directory tree, and the fnmatch module for matching file names.
What is OS.walk?
It generates the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).
dirpath # is a string, the path to the directory. dirnames # is a list of the names of the subdirectories in dirpath (excluding '.' and '..'). filenames # is a list of the names of the non-directory files in dirpath. Note that the names in the lists contain no path components.
To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name). For more information, please see the Python Docs.
What is Fnmatch
The fnmatch module compares file names against glob-style patterns such as used by Unix shells. These are not the same as the more sophisticated regular expression rules. It's purely a string matching operation. If you find it more convenient to use a different pattern style, for example regular expressions, then simply use regex operations to match your filenames. http://www.doughellmann.com/PyMOTW/fnmatch/
What does it do?
The fnmatch module is used for the wild-card pattern matching. Simple Matching fnmatch() compares a single file name against a pattern and returns a boolean indicating whether or not they match. The comparison is case-sensitive when the operating system uses a case-sensitive file system. Filtering To test a sequence of filenames, you can use filter(). It returns a list of the names that match the pattern argument.
Find all mp3 files
This script will search for *.mp3 files from the rootPath ("/")
import fnmatch import os rootPath = '/' pattern = '*.mp3' for root, dirs, files in os.walk(rootPath): for filename in fnmatch.filter(files, pattern): print( os.path.join(root, filename))
Search computer for specific files
This script uses 'os.walk' and 'fnmatch' with filters to search the hard-drive for all image files
import fnmatch import os images = ['*.jpg', '*.jpeg', '*.png', '*.tif', '*.tiff'] matches =  for root, dirnames, filenames in os.walk("C:\"): for extensions in images: for filename in fnmatch.filter(filenames, extensions): matches.append(os.path.join(root, filename))
There are many other (and faster) ways to do this, but now you understand the basics of it.
http://rosettacode.org/wiki/Walk_a_directory/Recursively#Python Stackoverflow Match Pattern Stackoverflow oswalk with fnmatch
Share this article
Recommended Python Training – DataCamp
For Python training, our top recommendation is DataCamp.
Datacamp provides online interactive courses that combine interactive coding challenges with videos from top instructors in the field.
Datacamp has beginner to advanced Python training that programmers of all levels benefit from.
Read more about: