7 måter å sjekke om en fil eller mappe finnes i Python

Python-standardbiblioteket inneholder det meste av funksjonaliteten en utvikler trenger for å løse et problem. I denne opplæringen lærer du forskjellige måter å sjekke eksistensen av en fil eller katalog ved å bruke bare innebygde moduler.

Å sjekke om en fil eller et skript er på riktig sted er avgjørende for ethvert CLI-program. Programmet ditt kan bli ubrukelig hvis en bestemt fil ikke er på plass i kjøreøyeblikket.

I dagens veiledning vil du lære noen raske måter å sjekke om en fil eller mappe finnes i Python.

Før start

Før du utfører en kommando nedenfor, sørg for at du har Python 3 installert på systemet ditt. Åpne terminalen og skriv inn følgende kommando:

python --version
# Python 3.9.5, my result

Hvis du har en 2.x-versjon, må du bruke kommandoen «python3». Sjekk ut vår Python-installasjonsveiledning hvis du ikke har Python 3 installert.

Vi kommer til å bruke noen testfiler sammen med denne opplæringen, så sørg for å lage følgende filer:

touch testfile.txt
mkdir testdirectory/ 
touch testdirectory/otherfile.txt

Kommandoene ovenfor oppretter en fil å leke med, en testkatalog og en annen fil inne i testkatalogen. Filene kan være tomme siden vi ikke trenger å lese innholdet,

Merk: Hvis du bruker Windows, sett opp den enkle filstrukturen med en grafisk filbehandling.

Til slutt skal vi bruke Ipython som vårt interaktive Python-skall som gir et pent grensesnitt å jobbe med. Dette er bare en vare, derfor ikke strengt nødvendig.

pip install ipython

Etter å ha gjort dette, får du tilgang til et vakkert Python-skall bare ved å skrive ipython.

Nå er du klar, la oss dykke ned i måter å sjekke om en mappe eller fil finnes i Python.

Prøv, Åpne og Unntatt

Dette er det mest enkle alternativet. Hvis du prøver å åpne en fil som ikke eksisterer, vil Python heve en FileNotFoundError.

In [1]: open('im-not-here.txt')
---------------------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

Vi kan dra nytte av dette, og håndtere unntaket i tilfelle filen vi leter etter ikke eksisterer.

In [2]: try:
   ...:     file = open('im-not-here.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn' exist')
   ...:     exit()
   ...: 
Sorry the file we're looking for doesn't exist

I koden ovenfor skriver vi ut en tilpasset melding og stopper kjøringen av programmet hvis filen ikke eksisterer.

  Bærbar datamaskin vil ikke koble til iPhone Hotspot (fungerer ikke)

Legg merke til hvordan exit()-funksjonen bare vil kjøre hvis et unntak oppstår. La oss se hva som skjer når filen vi leter etter faktisk eksisterer.

In [2]: try:
   ...:     file = open('testfile.txt')
   ...:     print(file) # File handler
   ...:     file.close()
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Legg merke til hvordan vi lukker filen rett etter at vi åpnet den. Det anses som en god praksis i henhold til Python dokumentasjon.

Ringe file.write() uten å bruke søkeordet with eller kalle file.close() kan føre til at argumentene til file.write() ikke blir skrevet fullstendig til disken, selv om programmet avsluttes.

Selv om vi ikke skriver til filen, er det ekstremt anbefalt å lukke filen fordi det kan føre til flere ytelsesproblemer.

Hvis vi ikke vil lukke filen selv, kan vi bruke med kontekstbehandling. Den tildeler og frigjør ressurser nøyaktig, derfor trenger vi ikke å lukke filen.

In [3]: try:
   ...:     with open('testfile.txt') as file:
   ...:         print(file)
   ...:         # No need to close the file
   ...: except FileNotFoundError:
   ...:     print('Sorry the file we're looking for doesn't exist')
   ...:     exit()
   ...: 
   ...: 
<_io.TextIOWrapper name="testfile.txt" mode="r" encoding='UTF-8'>

Denne metoden er ekstremt nyttig når du skriver i filer, men resulterer ineffektivt hvis vi bare vil sjekke om en fil eksisterer. La oss dykke ned i andre alternativer for å oppnå dette.

os.path.exists()

De os modul gir flere funksjoner for å samhandle med operativsystemet. For å sjekke om en fil eller mappe eksisterer kan vi bruke path.exists() funksjonen som aksepterer banen til filen eller katalogen som et argument. Den returnerer en boolsk verdi basert på eksistensen av banen.

Merk: En bane er den unike plasseringen til en fil eller katalog i et filsystem

I Python er os.sti undermodulen inneholder funksjoner eksklusivt designet for å operere med filbaner. Alle disse funksjonene aksepterer baneargumentet som strenger eller bytes, og du kan bestemme deg for å jobbe med absolutte baner, for eksempel:

/home/daniel/.bashrc

Eller med relative baner, avhengig av katalogen du kjører skriptet:

.bashrc
# Running the script in my home folder

Her er flere eksempler som bruker os.path.exists()-funksjonen, som kjører i katalogen testfilene mine er plassert:

In [1]: import os

In [2]: os.path.exists('testfile.txt')
Out[2]: True

In [3]: os.path.exists('testdirectory')
Out[3]: True

In [4]: os.path.exists('hey-i-dont-exist')
Out[4]: False

Som du kan se, returnerer den True når du tester med testfile.txt-filen og testkatalogmappen, og False når filen ikke eksisterer.

  Strømlinjeform dataene dine sømløst med Supermetrics

os.path.isfile()

Hvis du bare ønsket å bevise eksistensen av en fil (ikke en katalog), ville du kalt funksjonen os.path.isfile().

In [1]: import os

In [2]: os.path.isfile('testfile.txt')
Out[2]: True

In [3]: os.path.isfile('testdirectory/')
Out[3]: False

In [4]: os.path.isfile('i-dont-even-exist')
Out[4]: False

In [5]: os.path.isfile('testdirectory/otherfile.txt')
Out[5]: True

Merk: I UNIX slutter alle kataloger med en skråstrek (/), mens vi i Windows bruker en skråstrek (omvendt).

I koden ovenfor returnerer isfile()-funksjonen False ved to anledninger, la oss se hvorfor:

  • testdirectory/ er en katalog, derfor anses den ikke som en fil. Dette er ikke helt sant siden i Linux alt er en filbeskrivelsemen Python behandler kataloger annerledes bare for enkelhets skyld (Hvis du prøver å åpne en katalog får du en IsADirectoryError)
  • i-dont-even-exist peker på en fil som ironisk nok ikke eksisterer

os.path.isdir()

Hvis du vil sjekke at en katalog er på riktig sted, må du bruke os.path.isdir()-funksjonen, som bare returnerer True hvis den gitte banen peker til en katalog.

In [1]: import os

In [2]: os.path.isdir('testfile.txt')
Out[2]: False

In [3]: os.path.isdir('testdirectory')
Out[3]: True

In [4]: os.path.isdir('anotherfile.txt')
Out[4]: False

Legg merke til hvordan eksemplene ovenfor returnerer False selv når banen peker til en fil som eksisterer.

Glob

De glob modul gir funksjoner å jobbe med Unix skalllignende mønstre (derfor fungerer det ikke ordentlig på Windows). For å sjekke om en fil samsvarer med et mønster i gjeldende katalog, kan du bruke glob.glob() funksjon.

In [1]: import glob

In [2]: glob.glob('testfile.txt')
Out[2]: ['testfile.txt']

In [3]: glob.glob('testdirectory')
Out[3]: ['testdirectory']

I koden ovenfor er mønsteret som sendes til glob-funksjonen en normal streng som representerer banen til testfilen og katalogen. Siden begge banene eksisterer, returnerer funksjonen en liste med samsvarende banenavn i den.

Merk: Hvis mønsteret ikke stemte, ville du få en tom liste.

Med tanke på at vi kan overføre mønstre til glob-funksjonen, hvorfor ikke teste ut noen av hovedfordelene med den?

Koden nedenfor får alle filbanene med filtypen .txt og .py henholdsvis:

In [4]: glob.glob('*.txt')
Out[4]: ['testfile.txt']

In [5]: glob.glob('*.py')
Out[5]: 
['pathlib-exists.py',
 'list-dir.py',
 'glob-file.py',
 'open-except.py',
 'subprocess-test.py',
 'isfile.py',
 'exists.py',
 'isdir.py']

Bruke Path Class

De Baneklasse er en av de beste måtene å jobbe med baner på siden det gir oss et rent grensesnitt for å jobbe med filbaner som objekter.

  Hvordan sjekke om en celle ikke er tom i Google Sheets

Det viktigste er at Path-forekomster har alle metodene du trenger for å få informasjon om en bestemt bane. Dette inkluderer lignende funksjoner som de tidligere alternativene.

Merk: Du trenger Python 3.4 eller nyere for å bruke pathlib-biblioteket

Banemetodene du skal bruke:

Sjekk om det finnes en bane

In [1]: from pathlib import Path

In [2]: Path('testfile.txt').exists()
Out[2]: True

In [3]: Path('im-not-here.txt').exists()
Out[3]: False

In [4]: Path('testdirectory').exists()
Out[4]: True

Fungerer på samme måte som os.path.exists().

Sjekk om banen peker til en fil

In [5]: Path('testfile.txt').is_file()
Out[5]: True

In [6]: Path('testdirectory').is_file()
Out[6]: False

Tilsvarer os.path.isfile().

Sjekk om banen peker til en katalog

In [7]: Path('testfile.txt').is_dir()
Out[7]: False

In [8]: Path('testdirectory').is_dir()
Out[8]: True

Tilsvarer os.path.isdir().

delprosess

Hvis du er en elsker av underprosessmoduler, må du vite om dette alternativet. Du kan finne ut om en fil eller mappe eksisterer ved å bruke test kommando.

Merk: Testkommandoen fungerer bare i Unix.

Følgende testflagg vil få jobben gjort:

  • test -e: Sjekk om det finnes en bane
  • test -f: Sjekk om det finnes en fil
  • test-d: Sjekk om det finnes en mappe

I tilfelle du ønsker å dykke ned i flere testflagg, kan du lese manualen ved å kjøre:

man test

Sjekke en bane med underprosess:

Koden nedenfor bestemmer om det finnes en bane ved å sammenligne returkoden til underprosessen med 0.

Husk at i Linux, hvis en prosess gikk bra, vil den returnere null, hvis den ikke gjorde det, vil den returnere annen kode.

In [1]: from subprocess import run

In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0
Out[2]: True

In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0
Out[3]: False

I den første setningen importerer vi delprosessmodulen, og bruker deretter kjøre funksjon og får returkoden.

Bekrefte eksistensen av en fil med underprosess

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0
Out[4]: True

In [5]: run(['test', '-f', 'testdirectory']).returncode == 0
Out[5]: False

Sjekke en katalog med underprosess:

In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0
Out[6]: False

In [7]: run(['test', '-d', 'testdirectory']).returncode == 0
Out[7]: True

Det er ikke så anbefalt å bruke dette alternativet siden det bruker mer ressurser, og vi får ingen fordel av det.

Å oppsummere

Python er et av de mest brukte programmeringsspråkene for å automatisere prosesser ved å samhandle med operativsystemet. En kul ting du kan gjøre med den er å sjekke om det finnes en fil eller en mappe.

De enkleste å gjøre det er:

  • Åpning og håndtering av filunntak med en gang
  • Bruk av exists()-funksjonen til os.path- eller pathlib-modulene.

I denne opplæringen lærte du:

  • Hvordan åpne en fil og håndtere unntak i tilfelle den ikke eksisterer
  • Betydningen av stier
  • 3 forskjellige funksjoner os.path undermodulen gir for å sjekke eksistensen av en fil eller mappe
  • Unix bruker skråstreker fremover (/), mens Windows bruker skråstreker bakover ()

Neste les: Hva er en underprosess i Python? [5 Usage Examples]