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)

Vedere anche:

fnmatch
La documentazione della libreria standard per questo modulo.
glob
Il modulo glob combina le capacità di corrispondenza di fnmatch con os.listdir() per produrre elenchi di modelli di confonto per file e directory