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.
Tartalomjegyzék
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.
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.
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 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]