Python fnmatch

Python fnmatch

Når du jobber med filer og filsystemer, er det vanlig å søke gjennom mange filer for å oppdage en viss fil. Å finne de nødvendige filene fra mange filer vil ta en evighet hvis de gjøres manuelt. Som et resultat inkluderer operativsystemer og programmeringsspråk fasiliteter for dynamisk å finne nødvendige filer. Disse verktøyene retter seg vanligvis mot filnavn og bruker mønstermatching for å prøve å finne de aktuelle filene.

Fnmatch-biblioteket på Python-programmeringsspråket kan brukes til å finne filer i UNIX-baserte operativsystemer som macOS og Linux. Denne artikkelen bruker FNMatch -modulen i Python for å gjøre mønstermatching.

Hva er fnmatch?

Det er en vanlig Python -pakke for matchende jokertegn som de som brukes i UNIX -skjell. Hvis et enkelt filnavn samsvarer med et mønster, returnerer fnmatch () sann; Ellers returnerer det falskt.

Funksjoner levert av Fnmatch -modulen

Fnmatch -modulen inneholder funksjonene fnmatch (), fnmatchcase (), filter (), og oversette (). Eksempelprogrammer som demonstrerer hver funksjon i dybden finner du nedenfor.

Eksempel 1:

Dette er den første av flere eksempler i vår artikkel om FNMatch () -metoden. Hvis det gitte navnet på filen samsvarer med mønsterstrengen, returnerer den utførte Fnmatch () -metoden en boolsk verdi. Hvis operativsystemet er case-ufølsom, vil sammenligningen finne sted etter at begge parametrene er blitt normalisert til alle lavere tilfeller.

Her er et program; Først har vi importert Fnmatch og OS -modulen. Etter det ser vi etter alle filer som begynner med 'fnmatch' og slutter med '.py '. Til slutt, skriv ut resultatet, som du kan se i den siste kodelinjen.

Importer fnmatch
Importer OS
patrn = 'fnmatch_*.py '
trykk ('Mønsteret er', patrn)
skrive ut()
File_name = OS.ListDir ('.')
For navn i filnavn:
Skriv ut ('Navn på filen: %-25s %s' %(navn, fnmatch.fnmatch (navn, patrn)))

Her i utgangen kan du se at mønsteret og filene som samsvarer med mønsteret er oppført.

Eksempel 2:

Ett eksempel til å utdype FNMATCH -funksjonen. Denne funksjonen krever filnavnet og et tegnstrengmønster. Navnet på filen sammenlignes med mønsteret, og metoden returnerer sann eller usant.

I eksemplet nedenfor har vi importert glob- og fnmatch -modulene som er nødvendige for at dette programmet skal utføre. Etter det har vi samlet en liste over alle filer som er til stede i den gjeldende katalogen som passer til “*.py ”mønster.

Import glob, fnmatch
for files_names in (glob.glob ('*.*')):
if (fnmatch.fnmatch (files_names, "*.py ")):
print (files_names)

Nedenfor kan du finne ut at filene som samsvarer med mønsteret, hentes og er oppført.

Eksempel 3:

Nå vil vi diskutere Fnmatchcase () -funksjonen til Fnmatch. Hvis filnavnet streng samsvarer med den definerte mønsterstrengen, utfører denne funksjonen en sammenligning (case-sensitiv i dette scenariet) og returnerer en boolsk verdi. Verdien er enten sann eller falsk. Uansett innstillinger for filsystemet eller operativsystemet, kan du finne programkode for en case-sensitiv sammenligning her.

Etter å ha importert FNMATCH- og OS -modulen, har vi definert mønsteret (indikert som Patrn i koden) som søket vårt er basert på. Så har vi listet opp alle filene og de boolske verdiene hvis filen samsvarer med mønsteret.

Importer fnmatch
Importer OS
patrn = 'fnmatch_*.Py '
trykk ('mønster:', patrn)
skrive ut()
File_name = OS.ListDir ('.')
For navn i filnavn:
(Skriv ut ('Navn på filen: %-25s %s' %(navn, fnmatch.fnmatchcase (navn, patrn)))

Nedenfor kan du finne utdataene, og som du kan se at alle filene returnerer falske.

Eksempel 4:

I et annet eksempel på fnmatchcase nevnt nedenfor, begynner alle filer med bokstaven 'H' og utvidelsen '.py 'er først samlet i et fillisteobjekt. Fnmatch () -metoden brukes til å sende ut bare navn som begynner med bokstavenes h.'

Import glob, fnmatch
Filer = glob.glob ("h*.*")
filer
['data.txt ',' Demo.txt ',' historie.Py ',' History_internal.py ',' new_file.txt ',' pdb_history.sqlite ',]
for fil i filer:
Hvis fnmatch.fnmatchcase (fil, "h*.*") == True:
trykk (fil)

Nedenfor, Files -historien.PY og History_internal.Py vises på skjermbildet når de samsvarer med det definerte mønsteret.

Eksempel 5:

Nå snakker vi om FNMatch -modulens filterfunksjon. Denne metoden returnerer undergruppen på listen over navn som nøyaktig samsvarer med det medfølgende mønsteret fra de gitte navnene. Her kan du enkelt filtrere filer med ikke bare en, men mange filutvidelser. Undersøk koden nedenfor.

Her har vi importert de nødvendige modulene først og definerte mønsteret. Etter det, liste opp alle filene som samsvarer med kriteriene.

Importer fnmatch
Importer OS
patrn = 'fnmatch_*.py '
trykk ('mønster er:', patrn)
File_name = OS.ListDir ('.')
Print ('Filer er nevnt her:', File_name)
trykk ('Matches funnet:', fnmatch.filter (filnavn, patrn))

Her kan du observere at mønsteret vises først, og deretter blir filene hentet og vises. Til slutt vises kampene hvis de blir funnet. I vårt tilfelle blir det ikke funnet noen kamp.

Eksempel 6:

Et annet program utdyper filterfunksjonen. Her er det bare de filene hvis navn stemmer overens med mønsterparameteren, returneres av denne funksjonen. Av alle filer i den gjeldende katalogen gir følgende uttalelse en liste over filer med '.txt 'utvidelse.

Importer fnmatch
Files = ['Data.txt ',' Demo.txt ',' historie.Py ',' History_internal.py ',' new_file.txt ',' pdb_history.sqlite ',]
trykk (fnmatch.filter (filer, "*.tekst"))

Her er navnene på filene med '.txt 'utvidelse.

Eksempel 7:

Translate () -funksjonen til FNMatch -modulen er demonstrert i dette eksemplet. Denne funksjonen konverterer et skallstilmønster til et vanlig uttrykk som kan brukes med RE.match () (re.Match () bare samsvarer i begynnelsen av teksten, ikke hver linje). Vi har importert FNMatch- og RE -modulene, som du kan se i koden nedenfor. Mønsteret ble deretter transformert til et vanlig uttrykk ved bruk av oversettelsesmetoden ().

Importer fnmatch, re
reg_exp = fnmatch.oversette('*.tekst')
re_obj = re.kompilering (reg_exp)
print (reg_exp)
trykk (re_obj.Match ('Demo.tekst'))

Her kan du se utdataene fra ovennevnte oversettelsesmetodekodeprogram.

Eksempel 8:

Her er et annet eksempel på den samme funksjonen omtalt ovenfor. Etter å ha importert de nødvendige modulene, har vi utført oversettelsesfunksjonen vi har passert mønsteret som vi har definert i kodelinjen ovenfor. Returverdien til funksjonen blir deretter transformert til et vanlig uttrykk ved å bruke RE -modulens kompilering () -funksjon. Etter det brukes det til å matche det gitte mønsteret.

Import re
Importer fnmatch
Import glob
patrn = "*.tekst"
reg_exp = fnmatch.Oversatt (Patrn)
reg_exp
'(?s:.*\\.txt) \\ z '
res = re.kompilering (reg_exp)
for filnavn i glob.glob ("*.*"):
Hvis re.match (res, file_name):
print (file_name)

Her er resultatet når vi har utført programmet ovenfor.

Konklusjon:

Fnmatch () -funksjonen kan samsvare mellom en enkel strengmetode og et komplekst vanlig uttrykk. Det er vanligvis en rimelig ordning når bare et enkelt jokertegn er påkrevd for å behandle data. Vi har utdypet flere eksempler for å dekke dette emnet i detalj.