7 moduri de a verifica dacă un fișier sau un folder există în Python

Biblioteca standard Python conține cea mai mare parte a funcționalității de care ar avea nevoie un dezvoltator pentru a rezolva o problemă. În acest tutorial, veți învăța diferite moduri de a verifica existența unui fișier sau director folosind numai module încorporate.

Verificarea dacă un fișier sau script este în locul corect este crucială pentru orice program CLI. Programul dvs. ar putea deveni inutil dacă un anumit fișier nu este pe loc în momentul execuției.

În tutorialul de astăzi, veți învăța câteva moduri rapide de a verifica dacă un fișier sau un folder există în Python.

Înainte de a începe

Înainte de a executa orice comandă de mai jos, asigurați-vă că aveți Python 3 instalat în sistem. Deschideți terminalul și tastați următoarea comandă:

python --version
# Python 3.9.5, my result

Dacă aveți o versiune 2.x, va trebui să utilizați comanda „python3”. Consultați ghidul nostru de instalare Python dacă nu aveți instalat Python 3.

Vom folosi câteva fișiere de testare împreună cu acest tutorial, așa că asigurați-vă că creați următoarele fișiere:

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

Comenzile de mai sus creează un fișier cu care să te joci, un director de testare și un alt fișier în interiorul directorului de testare. Fișierele pot fi goale, deoarece nu va fi nevoie să le citim conținutul,

Notă: Dacă utilizați Windows, configurați acea structură simplă a fișierelor cu un manager de fișiere grafic.

În cele din urmă, vom folosi Ipython ca shell-ul nostru interactiv Python, care oferă o interfață frumoasă cu care să lucrați. Aceasta este doar o marfă, deci nu este strict necesară.

pip install ipython

După ce faceți acest lucru, veți avea acces la un frumos shell Python doar tastând ipython.

Acum ești gata, haideți să descoperim modalități de a verifica dacă un folder sau un fișier există în Python.

Încercați, Deschideți și Exceptați

Aceasta este varianta cea mai simplă. Dacă încercați să deschideți un fișier care nu există, Python va genera a FileNotFoundError.

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

Putem profita de acest lucru și gestionăm excepția în cazul în care fișierul pe care îl căutăm nu există.

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

În codul de mai sus, tipărim un mesaj personalizat și oprim execuția programului dacă fișierul nu există.

  Recuperați iPhone ca un profesionist fără niciun dezastru de date

Observați cum funcția exit() se va executa numai dacă este ridicată o excepție. Să vedem ce se întâmplă când fișierul pe care îl căutăm există cu adevărat.

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

Observați cum închidem fișierul imediat după ce l-am deschis. Este considerată o bună practică conform Documentație Python.

Apelarea cu sau apelarea file.write() să nu fie scrise complet pe disc, chiar dacă programul se închide cu succes.

Chiar dacă nu scriem în fișier, este extrem de recomandat să închidem fișierul, deoarece ar putea duce la multiple probleme de performanță.

Dacă nu dorim să închidem fișierul singuri, am putea folosi cu manager de context. Alocă și eliberează resurse precis, prin urmare nu va fi nevoie să închidem fișierul.

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

Această metodă este extrem de utilă atunci când scrieți în fișiere, dar rezultă ineficientă dacă vrem doar să verificăm dacă există un fișier. Să ne aruncăm în alte opțiuni pentru a realiza acest lucru.

os.path.exists()

The modulul os oferă mai multe funcții pentru a interacționa cu sistemul de operare. Pentru a verifica dacă un fișier sau un folder există, putem folosi funcția path.exists() care acceptă calea către fișier sau director ca argument. Returnează un boolean bazat pe existența căii.

Notă: O cale este locația unică a unui fișier sau director într-un sistem de fișiere

În Python, os.cale submodulul conține funcții concepute exclusiv pentru a funcționa cu căile fișierelor. Toate aceste funcții acceptă argumentul cale ca șiruri de caractere sau octeți și puteți decide să lucrați cu căi absolute, de exemplu:

/home/daniel/.bashrc

Sau cu căi relative, în funcție de directorul în care rulați scriptul:

.bashrc
# Running the script in my home folder

Iată mai multe exemple de utilizare a funcției os.path.exists(), care rulează în directorul în care se află fișierele mele de testare:

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

După cum puteți vedea, returnează True când se testează cu fișierul testfile.txt și folderul testdirectory și False când fișierul nu există.

  De ce aveți nevoie de o companie de întreținere WordPress?

os.path.isfile()

Dacă ați dori doar să demonstrați existența unui fișier (nu a unui director), ați apela funcția 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

Notă: În UNIX toate directoarele se termină cu o bară oblică (/), în timp ce în Windows folosim o bară oblică inversă ().

În codul de mai sus, funcția isfile() returnează False de două ori, să vedem de ce:

  • testdirectory/ este un director, prin urmare nu este considerat un fișier. Acest lucru nu este absolut adevărat deoarece în Linux totul este un descriptor de fișierdar Python tratează directoarele în mod diferit doar pentru comoditate (Dacă încercați să deschideți un director, veți obține un IsADirectoryError)
  • i-dont-even-exist indică un fișier care, în mod ironic, nu există

os.path.isdir()

Dacă doriți să verificați că un director este în locul corect, va trebui să utilizați funcția os.path.isdir(), care returnează True doar dacă calea dată indică către un director.

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

Observați cum exemplele de mai sus returnează False chiar și atunci când calea indică către un fișier care există.

Glob

The glob modulul oferă funcții cu care să lucrați Modele de tip shell Unix (deci nu funcționează corect pe Windows). Pentru a verifica dacă un fișier se potrivește cu un model din directorul curent, puteți utiliza glob.glob() funcţie.

In [1]: import glob

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

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

În codul de mai sus, modelul transmis funcției glob este un șir normal care reprezintă calea către fișierul și directorul de testare. Deoarece există ambele căi, funcția returnează o listă cu numele de căi care se potrivesc în interiorul acesteia.

Notă: dacă modelul nu se potrivește, veți primi o listă goală.

Având în vedere că putem transmite modele funcției glob, de ce să nu testam unele dintre principalele avantaje ale acesteia?

Codul de mai jos primește toate căile fișierelor cu extensia .txt și respectiv .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']

Utilizarea clasei Path

The Clasa de cale este una dintre cele mai bune moduri de a lucra cu căile, deoarece ne oferă o interfață curată pentru a lucra cu căile de fișiere ca obiecte.

Cireasa tortului este că instanțele Path au toate metodele de care aveți nevoie pentru a obține informații despre o anumită cale. Aceasta include funcționalități similare cu opțiunile anterioare.

  Cum să conectați la un alt diapozitiv în aceeași prezentare PowerPoint

Notă: veți avea nevoie de Python 3.4 sau mai mare pentru a utiliza biblioteca pathlib

Metodele Path pe care le veți folosi:

Verificați dacă există o cale

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

Funcționează la fel ca os.path.exists().

Verificați dacă calea indică către un fișier

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

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

Echivalent cu os.path.isfile().

Verificați dacă calea indică către un director

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

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

Corespunde cu os.path.isdir().

subproces

Dacă sunteți un iubitor de module de subprocese, va trebui să știți despre această opțiune. Puteți determina dacă un fișier sau un folder există utilizând comanda de testare.

Notă: Comanda de testare funcționează numai în Unix.

Următoarele steaguri de testare vor duce treaba la bun sfârșit:

  • test -e: Verificați dacă există o cale
  • test -f: Verificați dacă există un fișier
  • test-d: Verificați dacă există un folder

În cazul în care doriți să vă scufundați în mai multe steaguri de testare, puteți citi manualul rulând:

man test

Verificarea unei căi cu subproces:

Codul de mai jos determină dacă există o cale prin compararea codului de retur al subprocesului cu 0.

Amintiți-vă că în Linux, dacă un proces a mers bine, va returna zero, dacă nu va returna orice alt cod.

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

În prima declarație, importăm modulul de subproces, apoi utilizăm funcția de rulare și obținerea codului de returnare.

Verificarea existenței unui fișier cu subproces

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

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

Verificarea unui director cu subproces:

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

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

Nu este atât de recomandat să folosiți această opțiune, deoarece consumă mai multe resurse și nu obținem niciun avantaj de pe urma ei.

În concluzie

Python este unul dintre cele mai utilizate limbaje de programare pentru automatizarea proceselor prin interacțiunea cu sistemul de operare. Un lucru minunat pe care îl puteți face cu el este să verificați dacă există un fișier sau un folder.

Cele mai simple de a face acest lucru sunt:

  • Deschiderea și gestionarea excepțiilor fișierelor imediat
  • Folosind funcția exists() a modulelor os.path sau pathlib.

În acest tutorial ați învățat:

  • Cum să deschideți un fișier și să gestionați excepțiile în cazul în care nu există
  • Sensul căilor
  • 3 funcții diferite oferite de submodulul os.path pentru a verifica existența unui fișier sau folder
  • Unix folosește bare oblice înainte (/), în timp ce Windows folosește bare oblice inverse ()

Următoarea citire: Ce este un subproces în Python? [5 Usage Examples]