fnmatch — Combinación de patrones Glob al estilo Unix

Propósito:Manejar comparaciones de nombre de archivo al estilo Unix.

El módulo fnmatch se usa para comparar nombres de archivo con patrones estilo glob como los utilizados por los shells Unix.

Coincidencia simple

fnmatch() compara un único nombre de archivo con un patrón y devuelve un valor booleano, que indica si coinciden o no. La comparación distingue entre mayúsculas y minúsculas cuando el sistema operativo usa un sistema de archivos que distingue mayúsculas y minúsculas. .

fnmatch_fnmatch.py
import fnmatch
import os

pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
print()

files = os.listdir('.')
for name in files:
    print('Filename: {:<25} {}'.format(
        name, fnmatch.fnmatch(name, pattern)))

En este ejemplo, el patrón coincide con todos los archivos que comienzan con 'fnmatch_' y terminan en '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

Para forzar una comparación que distingue mayúsculas y minúsculas, independientemente del sistema de archivos y la configuración del sistema operativo, usa fnmatchcase().

fnmatch_fnmatchcase.py
import fnmatch
import os

pattern = 'FNMATCH_*.PY'
print('Pattern :', pattern)
print()

files = os.listdir('.')

for name in files:
    print('Filename: {:<25} {}'.format(
        name, fnmatch.fnmatchcase(name, pattern)))

Dado que el sistema OS X utilizado para probar este programa usa un sistema de archivos que distingue entre mayúsculas y minúsculas, ningún archivo coincide con el patrón modificado.

$ 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

Filtrando

Para probar una secuencia de nombres de archivo, usa filter(), que devuelve una lista de los nombres que coinciden con el argumento del patrón.

fnmatch_filter.py
import fnmatch
import os
import pprint

pattern = 'fnmatch_*.py'
print('Pattern :', pattern)

files = os.listdir('.')

print('\nFiles   :')
pprint.pprint(files)

print('\nMatches :')
pprint.pprint(fnmatch.filter(files, pattern))

En este ejemplo, filter() devuelve la lista de nombres de los ejemplos de los archivos fuente asociados con esta sección.

$ 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']

Traduciendo patrones

Internamente, fnmatch convierte el patrón de glob en una expresión regular estándar y utiliza el módulo re para comparar el nombre y el patrón. La función translate() es la interfaz pública para convertir los patrones glob a expresiones regulares.

fnmatch_translate.py
import fnmatch

pattern = 'fnmatch_*.py'
print('Pattern :', pattern)
print('Regex   :', fnmatch.translate(pattern))

Algunos de los caracteres se escapan para hacer una expresión válida.

$ python3 fnmatch_translate.py

Pattern : fnmatch_*.py
Regex   : fnmatch_.*\.py\Z(?ms)

Ver también

  • Standard library documentation for fnmatch
  • glob – El módulo glob combina la coincidencia fnmatch con os.listdir() para producir listas de archivos y directorios que coinciden con los patrones.
  • re – Coincidencia de patrón de expresión regular.