fnmatch - Corrispondenza su Modello Stile Unix Glob
Scopo: Gestisce i confronti su nomi di file stile Unix
Il modulo fnmatch viene utilizzato per confrontare nomi di file rispetto a modelli stile glob tipo quello utilizzato dalle shell Unix.
Corrispondenza Semplice
fnmatch confronta il nome di un singolo file con un modello e ritorna un valore booleano, che indica se la corrispondenza è stata trovata o meno. Il confronto è sensibile alle maiuscole quando anche il sistema operativo ospitante ha un file system che lo utilizza.
# fnmatch_fnmatch.py
import fnmatch
import os
pattern = 'fnmatch_*.py',
print('Modello :', pattern)
print()
files = os.listdir('.')
for name in files:
print('Nome file: {:<25} {}'.format(name, fnmatch.fnmatch(name, pattern)))
In questo esempio il modello trova corrispondenza con tutti i file che iniziano per 'fnmatch_'
e finiscono con .py
.
$ python3 fnmatch_fnmatch.py Modello : fnmatch_*.py Nome file: codecs_invertcaps.py False Nome file: fnmatch_fnmatch.py True Nome file: fnmatch_fnmatchcase.py True Nome file: fnmatch_filter.py True Nome file: urllib_quote.py False Nome file: time_struct.py False
Per forzare un confronto sensibile alle maiuscole, a prescindere dal file system e dalle impostazioni del sistema operativo, si usa fnmatchcase()
.
# fnmatch_fnmatchcase.py
import fnmatch
import os
pattern = 'FNMATCH_*.PY',
print('Modello :', pattern)
print()
files = os.listdir('.')
for name in files:
print('Nome file: {:<25} {}'.format(
name, fnmatch.fnmatchcase(name, pattern)))
Visto che il sistema Unix utilizzato per eseguire questo esempio usa un file system sensibile alle maiuscole nessun file corrisponde al modello modificato.
$ python3 fnmatch_fnmatchcase.py Modello : FNMATCH_*.PY Nome file: codecs_invertcaps.py False Nome file: fnmatch_fnmatch.py False Nome file: fnmatch_fnmatchcase.py False Nome file: fnmatch_filter.py False Nome file: urllib_quote.py False Nome file: time_struct.py False
Filtrare
Per verificare una sequenza di nomi di file si usa filter()
, che ritorna una lista dei nomi che corrispondono con l'argomento pattern
.
# fnmatch_filter.py
import fnmatch
import os
import pprint
pattern = 'fnmatch_*.py',
print('Modello :', pattern)
files = os.listdir('.')
print('\nFile :')
pprint.pprint(files)
print('\nCorrispondenze:')
pprint.pprint(fnmatch.filter(files, pattern))
In questo esempio, filter()
ritorna l'elenco di nomi di file sorgente di esempio associati a questo argomento.
$ python3 fnmatch_filter.py Modello: fnmatch_*.py File : ['codecs_invertcaps.py', 'fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_filter.py', 'urllib_quote.py', 'time_struct.py'] Corrispondenze: ['fnmatch_fnmatch.py', 'fnmatch_fnmatchcase.py', 'fnmatch_filter.py']
Interpretare i Modelli
Internamente fnmatch converte il modello glob in una espressione regolare ed utilizza il modulo re
per confrontare nome e modello. La funzione translate()
è l'API pubblica per convertire modelli glob in espressioni regolari.
# fnmatch_translate.py
import fnmatch
pattern = 'fnmatch_*.py'
print('Modello :', pattern)
print('Regex :', fnmatch.translate(pattern))
Alcuni caratteri sono preceduti da sequenze di escape per rendere valida una espressione.
$ python3 fnmatch_translate.py Modello : fnmatch_*.py Regex : fnmatch_.*\.py\Z(?ms)