Scopo | Gestisce il confronto con i nomi dei file in stile Unix |
Versione Python | 1.4 e superiore |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per il modulo fnmatch
Il modulo fnmatch viene usato per confrontare nomi di file con i modelli in stile glob così come vengono usati dalle shell Unix.
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
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']
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$