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.