fnmatch - Confrontare nomi di file con i modelli di glob in stile Unix

Scopo Gestisce il confronto con i nomi dei file in stile Unix
Versione Python 1.4 e superiore

Il modulo fnmatch viene usato per confrontare nomi di file con i modelli in stile glob così come vengono usati dalle shell Unix.

Corrispondenza semplice

fnmatch() confronta un singolo nome di file con un modello e restituisce un valore booleano che indica se la corrispondenza è stata trovata. Se il sistema operativo usa un filesystem insensibile alle differenze tra maiuscolo e minuscolo il confronto non terrà conto della differenza tra maiuscolo/minuscole. Altrimenti sì'.

import fnmatch
import os

pattern = 'fnmatch_*.py'
print 'Modello :', pattern
print

files = os.listdir('.')
for name in files:
    print 'Nome file: %-25s %s' % (name, fnmatch.fnmatch(name, pattern))

In questo esempio, il modello cerca la corrispondenza con tutti i file che iniziano per "fnmatch" e finiscono in ".py".

$ python fnmatch_fnmatch.py
Modello : fnmatch_*.py

Nome file: __init__.py               False
Nome file: __init__.pyc              False
Nome file: fnmatch_filter.py         True
Nome file: fnmatch_fnmatch.py        True
Nome file: fnmatch_fnmatchcase.py    True
Nome file: fnmatch_translate.py      True
Nome file: index.rst                 False

Per forzare un confronto sensibile al maiuscolo/minuscolo a prescindere dalle impostazioni del filesystem e del sistema operativo si usa fnmatchcase().

import fnmatch
import os

pattern = 'FNMATCH_*.PY'
print 'Modello :', pattern
print

files = os.listdir('.')
for name in files:
    print 'Nome file: %-25s %s' % (name,  fnmatch.fnmatchcase(name, pattern))

Visto che il mio laptop usa un sistema operativo sensibile al maiuscolo/minuscolo nessun file corrisponde al modello modificato.

$ python fnmatch_fnmatchcase.py
Modello : FNMATCH_*.PY

Nome file: __init__.py               False
Nome file: __init__.pyc              False
Nome file: fnmatch_filter.py         False
Nome file: fnmatch_fnmatch.py        False
Nome file: fnmatch_fnmatchcase.py    False
Nome file: fnmatch_translate.py      False
Nome file: index.rst                 False

Filtrare

Per verificare una sequenza di nomi di file si può usare filter(), che restituisce un elenco di nomi che corrispondono al parametro pattern

import fnmatch
import os

pattern = 'fnmatch_*.py'
print 'Modello :', pattern

files = os.listdir('.')
print 'File    :', files

print 'Corrispondenze :', fnmatch.filter(files, pattern)

In questo esempio, filter() restituisce una lista di nomi dai file sorgente dell'esempio associato a questo post.

$ python fnmatch_filter.py
Modello : fnmatch_*.py
File    : ['__init__.py', '__init__.pyc', 'fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py', 'index.rst']
Corrispondenze : ['fnmatch_filter.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_translate.py']

Trascodifica dei Modelli

Internamente, fnmatch converte il modello glob in una espressione regolare ed usa il modulo re per confrontare nome e modello. La funzione translate() è l'API pubblica per convertire modelli glob in espressioni regolari.

import fnmatch

pattern = 'fnmatch_*.py'
print 'Modello      :', pattern
print 'Espr. regolare:', fnmatch.translate(pattern)

Si noti che alcuni caratteri sono preceduti da una sequenza di escape per renderli una espressione valida.

$ python fnmatch_translate.py
Modello       : fnmatch_*.py
Espr. regolare: fnmatch\_.*\.py$

Vedere anche:

fnmatch
La documentazione della libreria standard per questo modulo.
glob
Il modulo glob combina il sistema di corrispondenza di fnmatch con os.listdir() per produrre elenchi di file e directory che corrispondono a modelli.