fnmatch — Unix-style Glob Pattern Matching¶
Purpose: | Handle Unix-style filename comparisons. |
---|
The fnmatch
module is used to compare filenames against
glob-style patterns such as used by Unix shells.
Simple Matching¶
fnmatch()
compares a single filename 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.
import fnmatch
import os
pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
print()
files = os.listdir('.')
for name in sorted(files):
print('Filename: {:<25} {}'.format(
name, fnmatch.fnmatch(name, pattern)))
In this example, the pattern matches all files starting with
'fnmatch_'
and ending in '.py'
.
$ python3 fnmatch_fnmatch.py
Pattern : fnmatch_*.py
Filename: fnmatch_filter.py True
Filename: fnmatch_fnmatch.py True
Filename: fnmatch_fnmatchcase.py True
Filename: fnmatch_translate.py True
Filename: index.rst False
To force a case-sensitive comparison, regardless of the file system and
operating system settings, use fnmatchcase()
.
import fnmatch
import os
pattern = 'FNMATCH_*.PY'
print('Pattern :', pattern)
print()
files = os.listdir('.')
for name in sorted(files):
print('Filename: {:<25} {}'.format(
name, fnmatch.fnmatchcase(name, pattern)))
Since the OS X system used to test this program uses a case-sensitive file system, no files match the modified pattern.
$ python3 fnmatch_fnmatchcase.py
Pattern : FNMATCH_*.PY
Filename: fnmatch_filter.py False
Filename: fnmatch_fnmatch.py False
Filename: fnmatch_fnmatchcase.py False
Filename: fnmatch_translate.py False
Filename: index.rst False
Filtering¶
To test a sequence of filenames, use filter()
, which returns a
list of the names that match the pattern argument.
import fnmatch
import os
import pprint
pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
files = list(sorted(os.listdir('.')))
print('\nFiles :')
pprint.pprint(files)
print('\nMatches :')
pprint.pprint(fnmatch.filter(files, pattern))
In this example, filter()
returns the list of names of the
example source files associated with this section.
$ python3 fnmatch_filter.py
Pattern : fnmatch_*.py
Files :
['fnmatch_filter.py',
'fnmatch_fnmatch.py',
'fnmatch_fnmatchcase.py',
'fnmatch_translate.py',
'index.rst']
Matches :
['fnmatch_filter.py',
'fnmatch_fnmatch.py',
'fnmatch_fnmatchcase.py',
'fnmatch_translate.py']
Translating Patterns¶
Internally, fnmatch
converts the glob pattern to a regular
expression and uses the re
module to compare the name and
pattern. The translate()
function is the public API for
converting glob patterns to regular expressions.
import fnmatch
pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
print('Regex :', fnmatch.translate(pattern))
Some of the characters are escaped to make a valid expression.
$ python3 fnmatch_translate.py
Pattern : fnmatch_*.py
Regex : (?s:fnmatch_.*\.py)\Z
See also
- Standard library documentation for fnmatch
glob
– The glob module combinesfnmatch
matching withos.listdir()
to produce lists of files and directories matching patterns.re
– Regular expression pattern matching.