7 måder at kontrollere, om en fil eller mappe findes i Python

Python-standardbiblioteket indeholder det meste af den funktionalitet, som en udvikler skal bruge for at løse et problem. I denne øvelse lærer du forskellige måder at kontrollere eksistensen af ​​en fil eller et bibliotek ved kun at bruge indbyggede moduler.

At kontrollere, om en fil eller et script er på det rigtige sted, er afgørende for ethvert CLI-program. Dit program kan blive ubrugeligt, hvis en bestemt fil ikke er på plads på tidspunktet for udførelse.

I dagens selvstudie lærer du nogle hurtige måder at kontrollere, om der findes en fil eller mappe i Python.

Inden start

Før du udfører en kommando nedenfor, skal du sørge for, at du har Python 3 installeret på dit system. Åbn din terminal og skriv følgende kommando:

python --version
# Python 3.9.5, my result

Hvis du har en 2.x-version, skal du bruge kommandoen “python3”. Tjek vores Python installationsvejledning, hvis du ikke har Python 3 installeret.

Vi vil bruge nogle testfiler sammen med denne vejledning, så sørg for at oprette følgende filer:

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

Kommandoerne ovenfor opretter en fil at lege med, en testmappe og en anden fil inde i testmappen. Filerne kan være tomme, da vi ikke behøver at læse deres indhold,

Bemærk: Hvis du bruger Windows, skal du konfigurere den enkle filstruktur med en grafisk filhåndtering.

Endelig skal vi bruge Ipython som vores interaktive Python-skal, som giver en smuk grænseflade at arbejde med. Dette er kun en handelsvare, derfor ikke strengt nødvendigt.

pip install ipython

Når du har gjort dette, får du adgang til en smuk Python-skal blot ved at skrive ipython.

Nu er du klar, lad os dykke ned i måder at kontrollere, om der findes en mappe eller fil i Python.

Prøv, Åbn og Undtagen

Dette er den mest ligetil mulighed. Hvis du prøver at åbne en fil, der ikke eksisterer, vil Python rejse en FileNotFoundError.

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

Vi kan drage fordel af dette og håndtere undtagelsen, hvis den fil, vi leder efter, 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 udskriver vi en brugerdefineret meddelelse og stopper udførelsen af ​​programmet, hvis filen ikke eksisterer.

  Definer dit forretningsmål med disse 6 strategikortlægningsskabeloner

Bemærk, hvordan exit()-funktionen kun udføres, hvis en undtagelse er rejst. Lad os se, hvad der sker, når den fil, vi leder efter, 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'>

Bemærk, hvordan vi lukker filen lige efter, at vi har åbnet den. Det anses for en god praksis ifølge Python dokumentation.

Kalder file.write() uden at bruge søgeordet med eller kalder file.close() kan resultere i, at argumenterne for file.write() ikke bliver skrevet fuldstændigt til disken, selvom programmet afsluttes.

Selvom vi ikke skriver til filen, anbefales det stærkt at lukke filen, fordi det kan føre til flere præstationsproblemer.

Hvis vi ikke selv ønsker at lukke filen, kan vi bruge med konteksthåndtering. Det allokerer og frigiver ressourcer præcist, derfor behøver 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 metode er yderst nyttig, når du skriver i filer, men resulterer ineffektivt, hvis vi kun vil kontrollere, om en fil eksisterer. Lad os dykke ned i andre muligheder for at opnå dette.

os.path.exists()

Det os modul giver flere funktioner til at interagere med operativsystemet. For at kontrollere, om en fil eller mappe findes, kan vi bruge path.exists()-funktionen, som accepterer stien til filen eller mappen som et argument. Den returnerer en boolean baseret på eksistensen af ​​stien.

Bemærk: En sti er den unikke placering af en fil eller et bibliotek i et filsystem

I Python er os.sti undermodul indeholder funktioner, der udelukkende er designet til at fungere med filstier. Alle disse funktioner accepterer sti-argumentet som strenge eller bytes, og du kan beslutte at arbejde med absolutte stier, for eksempel:

/home/daniel/.bashrc

Eller med relative stier, afhængigt af den mappe, du kører scriptet:

.bashrc
# Running the script in my home folder

Her er flere eksempler, der bruger os.path.exists()-funktionen, der kører i den mappe, mine testfiler er placeret:

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 testmappe-mappen, og False, når filen ikke eksisterer.

  Sådan forbedres FPS i PUGB [Playerunknown’s Battlegrounds]

os.path.isfile()

Hvis du kun ville bevise eksistensen af ​​en fil (ikke en mappe), ville du kalde os.path.isfile()-funktionen.

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

Bemærk: I UNIX ender alle mapper med en skråstreg (/), hvorimod vi i Windows bruger en omvendt skråstreg ().

I koden ovenfor returnerer isfile()-funktionen False ved to lejligheder, lad os se hvorfor:

  • testdirectory/ er en mappe, derfor betragtes den ikke som en fil. Dette er ikke helt sandt siden i Linux alt er en filbeskrivelsemen Python behandler mapper anderledes bare for nemheds skyld (hvis du prøver at åbne en mappe, får du en IsADirectoryError)
  • i-dont-even-exist peger på en fil, der ironisk nok ikke eksisterer

os.path.isdir()

Hvis du vil kontrollere, at en mappe er på det rigtige sted, skal du bruge os.path.isdir()-funktionen, som kun returnerer True, hvis den givne sti peger på en mappe.

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

Bemærk, hvordan eksemplerne ovenfor returnerer False, selv når stien peger på en fil, der eksisterer.

Glob

Det glob modul giver funktioner at arbejde med Unix-skallignende mønstre (det virker derfor ikke korrekt på Windows). For at kontrollere, om en fil matcher et mønster i den aktuelle mappe, kan du bruge glob.glob() fungere.

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, der sendes til glob-funktionen, en normal streng, der repræsenterer stien til testfilen og biblioteket. Da begge stier findes, returnerer funktionen en liste med de matchende stinavne inde i den.

Bemærk: Hvis mønsteret ikke matchede, ville du få en tom liste.

I betragtning af at vi kan overføre mønstre til glob-funktionen, hvorfor så ikke teste nogle af de vigtigste fordele ved det?

Koden nedenfor får alle filstierne med filtypenavnet henholdsvis .txt og .py:

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']

Brug af Path Class

Det Sti klasse er en af ​​de bedste måder at arbejde med stier på, da det giver os en ren grænseflade til at arbejde med filstier som objekter.

  Sådan rettes ERR_CONNECTION_REFUSED-fejl i Chrome

Kernen ved kagen er, at Path-instanser har alle de metoder, du har brug for for at få information om en bestemt sti. Dette inkluderer funktioner, der ligner de tidligere muligheder.

Bemærk: Du skal bruge Python 3.4 eller nyere for at bruge pathlib-biblioteket

Stimetoderne, du vil bruge:

Tjek, om der findes en sti

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

Virker på samme måde som os.path.exists().

Tjek, om stien peger på en fil

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

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

Svarende til os.path.isfile().

Tjek, om stien peger på en mappe

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

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

Svarer til os.path.isdir().

delproces

Hvis du elsker underprocesmoduler, skal du vide om denne mulighed. Du kan afgøre, om der findes en fil eller mappe ved at bruge test kommando.

Bemærk: Testkommandoen virker kun i Unix.

Følgende testflag vil få arbejdet gjort:

  • test -e: Tjek om der findes en sti
  • test -f: Tjek om der findes en fil
  • test-d: Tjek om der findes en mappe

Hvis du vil dykke ned i flere testflag, kan du læse manualen ved at køre:

man test

Kontrol af en sti med underproces:

Koden nedenfor bestemmer, om der findes en sti ved at sammenligne returkoden for underprocessen med 0.

Husk, at i Linux, hvis en proces gik godt, vil den returnere nul, hvis den ikke gjorde det, returnerer den enhver anden 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 sætning importerer vi underprocesmodulet og bruger derefter køre funktion og får sin returkode.

Bekræftelse af eksistensen af ​​en fil med underproces

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

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

Kontrol af en mappe med underproces:

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å anbefalet at bruge denne mulighed, da den bruger flere ressourcer, og vi får ingen fordele af den.

For at opsummere

Python er et af de mest brugte programmeringssprog til at automatisere processer ved at interagere med OS. En fed ting, du kan gøre med det, er at tjekke, om der findes en fil eller en mappe.

Det mest ligetil at gøre det er:

  • Åbning og håndtering af filundtagelser med det samme
  • Brug af funktionen exists() i os.path- eller pathlib-modulerne.

I denne tutorial lærte du:

  • Hvordan man åbner en fil og håndterer undtagelser, hvis den ikke eksisterer
  • Betydningen af ​​stier
  • 3 forskellige funktioner os.path undermodulet giver til at kontrollere eksistensen af ​​en fil eller mappe
  • Unix bruger skråstreger frem (/), mens Windows bruger skråstreger tilbage ()

Læs næste: Hvad er en underproces i Python? [5 Usage Examples]