fnmatch Module in Python

fnmatch Module in Python

>>> dir(fnmatch)
[‘__all__’, ‘__builtins__’, ‘__cached__’, ‘__doc__’, ‘__file__’, ‘__initializing
__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘_compile_pattern’, ‘filter’, ‘fnm
atch’, ‘fnmatchcase’, ‘functools’, ‘os’, ‘posixpath’, ‘re’, ‘translate’]
>>>

We can see that this module contains other modules: re and os. Thanks to the fnmatch module, we can filter folders and files with shell patterns.

fnmatch(name, pattern) -> True if the name is matching the pattern

>>> fnmatch.fnmatch(“Kasia”, “K*s*a”)
True
>>> fnmatch.fnmatch(“Ala”, “?l?”)
True
>>> fnmatch.fnmatch(“Ala”, “?le”)
False
>>>

>>> for c in os.listdir(“D:/”):
…     fnmatch.fnmatch(c,”*.txt”)

False
True
False
True
True
False
False
False
False
False
False
False
False
False
False
True
False
False
False
>>>

It’s not exactly what we need. We should do something else:

>>> for c in os.listdir(“D:/”):
…     if fnmatch.fnmatch(c, “*.txt”):
…             print(c)

artyk.txt
derek.txt
dereka.txt
pliczek.txt
>>>

That’s it!

filter

>>> v = [“derek.txt”, “eta.csv”, “zeta.csv”, “pliczek.txt”]
>>> v
[‘derek.txt’, ‘eta.csv’, ‘zeta.csv’, ‘pliczek.txt’]

>>> fnmatch.filter(v, “*.csv”)
[‘eta.csv’, ‘zeta.csv’]
>>>

>>> fnmatch.filter(v, “*.txt”)
[‘derek.txt’, ‘pliczek.txt’]
>>>

We can use the filter function to filter a list against a pattern.

translate

>>> j = fnmatch.translate(“*.txt, c[eao]*.txt, t?.csv”)
>>> j
‘.*\\.txt\\,\\ c[eao].*\\.txt\\,\\ t.\\.csv\\Z(?ms)’
>>>

We can get the original regex (for reusing later).

Leave a comment