7 módszer annak ellenőrzésére, hogy létezik-e fájl vagy mappa a Pythonban

A Python szabványos könyvtára tartalmazza a legtöbb olyan funkciót, amelyre a fejlesztőnek szüksége van egy probléma megoldásához. Ebből az oktatóanyagból megtudhatja, hogyan lehet ellenőrizni egy fájl vagy könyvtár létezését csak beépített modulok használatával.

Annak ellenőrzése, hogy egy fájl vagy szkript a megfelelő helyen van-e, döntő fontosságú minden CLI-program esetében. A program használhatatlanná válhat, ha egy adott fájl nincs a helyén a végrehajtás pillanatában.

A mai oktatóanyagból megtudhat néhány gyors módszert annak ellenőrzésére, hogy létezik-e fájl vagy mappa a Pythonban.

Kezdés előtt

Az alábbi parancsok végrehajtása előtt győződjön meg arról, hogy a Python 3 telepítve van a rendszeren. Nyissa meg a terminált, és írja be a következő parancsot:

python --version
# Python 3.9.5, my result

Ha 2.x verziója van, akkor a „python3” parancsot kell használnia. Tekintse meg Python telepítési útmutatónkat, ha nincs telepítve a Python 3.

Ehhez az oktatóanyaghoz néhány tesztfájlt fogunk használni, ezért mindenképpen hozza létre a következő fájlokat:

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

A fenti parancsok létrehoznak egy lejátszható fájlt, egy tesztkönyvtárat és egy másik fájlt a tesztkönyvtárban. A fájlok üresek lehetnek, mivel nem kell elolvasnunk a tartalmukat,

Megjegyzés: Ha Windows rendszert használ, állítsa be az egyszerű fájlszerkezetet egy grafikus fájlkezelővel.

Végül is használni fogjuk Ipython mint az interaktív Python shellünk, amely szép felületet biztosít a munkához. Ez csak egy áru, ezért nem feltétlenül szükséges.

pip install ipython

Ezt követően az ipython beírásával hozzáférhet egy gyönyörű Python-héjhoz.

Most már minden készen áll, nézzük meg, hogyan ellenőrizheti, létezik-e mappa vagy fájl a Pythonban.

Kipróbálás, megnyitás és kivétel

Ez a legegyszerűbb lehetőség. Ha nem létező fájlt próbál megnyitni, a Python felveti a FileNotFoundError.

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

Kihasználhatjuk ezt, és kezelhetjük a kivételt abban az esetben, ha a keresett fájl nem létezik.

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

A fenti kódban egy egyéni üzenetet nyomtatunk, és leállítjuk a program végrehajtását, ha a fájl nem létezik.

  A Fitbit Inspire 2 alaphelyzetbe állítása adatvesztés nélkül

Figyeld meg, hogy az exit() függvény csak kivétel esetén fut le. Nézzük meg, mi történik, ha a keresett fájl valóban létezik.

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

Jegyezze meg, hogyan zárjuk be a fájlt közvetlenül a megnyitás után. szerint ez jó gyakorlatnak számít Python dokumentáció.

A file.write() meghívása a with kulcsszó nélkül, vagy a file.close() azt eredményezheti, hogy a file.write() argumentumai nem íródnak be teljesen a lemezre, még akkor sem, ha a program sikeresen kilép.

Még ha nem is írunk a fájlba, rendkívül ajánlott a fájl bezárása, mert ez a fájlhoz vezethet több teljesítményprobléma.

Ha nem akarjuk magunktól bezárni a fájlt, használhatjuk a környezetkezelővel. Pontosan lefoglalja és felszabadítja az erőforrásokat, ezért nem kell bezárnunk a fájlt.

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

Ez a módszer rendkívül hasznos, ha fájlba írunk, de nem hatékony, ha csak azt akarjuk ellenőrizni, hogy létezik-e fájl. Vegyünk más lehetőségeket ennek eléréséhez.

os.path.exists()

Az os modul több funkciót biztosít az operációs rendszerrel való interakcióhoz. Annak ellenőrzésére, hogy létezik-e fájl vagy mappa, használhatjuk a path.exists() függvényt, amely argumentumként elfogadja a fájl vagy könyvtár elérési útját. Az elérési út létezése alapján logikai értéket ad vissza.

Megjegyzés: Az elérési út egy fájl vagy könyvtár egyedi helye a fájlrendszerben

A Pythonban a os.path almodul olyan funkciókat tartalmaz, amelyeket kizárólag a fájl útvonalakkal való működésre terveztek. Ezek a függvények mindegyike elfogadja az elérési út argumentumot karakterláncként vagy bájtként, és dönthet úgy, hogy abszolút elérési utakkal dolgozik, például:

/home/daniel/.bashrc

Vagy relatív elérési utakkal, attól függően, hogy melyik könyvtárban futtatja a szkriptet:

.bashrc
# Running the script in my home folder

Íme több példa az os.path.exists() függvény használatára, amely abban a könyvtárban fut, ahol a tesztfájljaim találhatók:

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

Amint láthatja, a tesztfile.txt fájllal és a testdirectory mappával végzett teszteléskor True értéket ad vissza, ha a fájl nem létezik, hamis értéket ad vissza.

  A 8 legjobb videocsevegő-alkalmazás Androidon

os.path.isfile()

Ha csak egy fájl (nem egy könyvtár) létezését szeretné bizonyítani, akkor az os.path.isfile() függvényt hívja meg.

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

Megjegyzés: UNIX-ban minden könyvtár perjelre (/) végződik, míg a Windowsban fordított perjelet (/) használunk.

A fenti kódban az isfile() függvény két alkalommal False értéket ad vissza, nézzük meg, miért:

  • A testdirectory/ egy könyvtár, ezért nem tekintendő fájlnak. Ez nem teljesen igaz, mivel Linux alatt minden egy fájlleíróde a Python a kényelem kedvéért másként kezeli a könyvtárakat (ha megpróbál megnyitni egy könyvtárat, IsADirectoryError üzenetet kap)
  • Az i-dont-even-exist egy olyan fájlra mutat, amely ironikus módon nem létezik

os.path.isdir()

Ha ellenőrizni szeretné, hogy egy könyvtár a megfelelő helyen van-e, akkor az os.path.isdir() függvényt kell használnia, amely csak akkor ad vissza True értéket, ha az adott elérési út egy könyvtárra mutat.

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

Vegye figyelembe, hogy a fenti példák hamis értéket adnak vissza, még akkor is, ha az elérési út egy létező fájlra mutat.

Glob

Az glob modul olyan funkciókat biztosít, amelyekkel dolgozni lehet Unix shell-szerű minták (ezért nem működik megfelelően Windows alatt). Ha ellenőrizni szeretné, hogy egy fájl megfelel-e az aktuális könyvtárban lévő mintának, használja a glob.glob() funkció.

In [1]: import glob

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

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

A fenti kódban a glob függvénynek átadott minta egy normál karakterlánc, amely a tesztfájl és a könyvtár elérési útját jelenti. Mivel mindkét elérési út létezik, a függvény egy listát ad vissza az egyező elérési útnevekkel.

Megjegyzés: Ha a minta nem egyezik, akkor egy üres lista jelenik meg.

Figyelembe véve, hogy átadhatunk mintákat a glob függvénynek, miért ne próbálhatnánk ki néhány fő előnyeit?

Az alábbi kód megkapja az összes fájl elérési utat .txt és .py kiterjesztéssel:

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

Az Útvonal osztály használata

Az Út osztály az egyik legjobb módja az elérési utakkal való munkavégzésnek, mivel tiszta felületet biztosít számunkra a fájl elérési útjainak objektumként való kezeléséhez.

  A hálózati sávszélesség figyelése egyszerű ezzel a 6 eszközzel

A torta cseresznye az, hogy a Path-példányok minden olyan módszerrel rendelkeznek, amelyre szükséged lehet egy bizonyos útvonallal kapcsolatos információk megszerzéséhez. Ez az előző opciókhoz hasonló funkciókat tartalmaz.

Megjegyzés: A pathlib könyvtár használatához Python 3.4 vagy újabb verzióra lesz szüksége

Az Ön által használt útvonal módszerek:

Ellenőrizze, hogy létezik-e útvonal

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

Ugyanúgy működik, mint az os.path.exists().

Ellenőrizze, hogy az elérési út egy fájlra mutat-e

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

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

Egyenértékű a következővel: os.path.isfile().

Ellenőrizze, hogy az elérési út egy könyvtárra mutat-e

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

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

Az os.path.isdir()-nek felel meg.

részfolyamat

Ha Ön az alfolyamat-modulok szerelmese, akkor tudnia kell erről a lehetőségről. A segítségével meghatározhatja, hogy létezik-e fájl vagy mappa teszt parancsot.

Megjegyzés: A tesztparancs csak Unix alatt működik.

A következő tesztjelzők elvégzik a munkát:

  • teszt -e: Ellenőrizze, hogy létezik-e elérési út
  • test -f: Ellenőrizze, hogy létezik-e fájl
  • test-d: Ellenőrizze, hogy létezik-e mappa

Ha további tesztjelzőkbe szeretne belemerülni, a kézikönyvet a következő futtatásával olvashatja el:

man test

Útvonal ellenőrzése alfolyamattal:

Az alábbi kód az alfolyamat visszatérési kódjának 0-val való összehasonlításával határozza meg, hogy létezik-e elérési út.

Ne feledje, hogy Linuxban, ha egy folyamat jól ment, akkor nullát ad vissza, ha nem, akkor bármilyen más kódot ad vissza.

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

Az első utasításban az alfolyamat modult importáljuk, majd a futtatás funkció és megkapja a visszatérési kódját.

Egy részfolyamattal rendelkező fájl létezésének ellenőrzése

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

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

Könyvtár ellenőrzése alfolyamattal:

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

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

Nem nagyon ajánlott ezt az opciót használni, mivel több erőforrást fogyaszt, és semmi előnyünk nem származik belőle.

Összefoglalva

A Python az egyik leggyakrabban használt programozási nyelv a folyamatok automatizálására az operációs rendszerrel való interakció révén. Az egyik nagyszerű dolog, amit tehet vele, hogy ellenőrizze, létezik-e fájl vagy mappa.

A legegyszerűbbek a következők:

  • A fájlkivételek azonnali megnyitása és kezelése
  • Az os.path vagy pathlib modulok létezik() függvényének használata.

Ebben az oktatóanyagban megtanultad:

  • Hogyan lehet megnyitni egy fájlt és kezelni a kivételeket, ha nem létezik
  • Az utak jelentése
  • Az os.path almodul 3 különböző funkciót biztosít egy fájl vagy mappa létezésének ellenőrzésére
  • A Unix előre perjelet (/), míg a Windows hátra perjelet ()

Következő olvassa el: Mi az alfolyamat a Pythonban? [5 Usage Examples]