7 způsobů, jak zkontrolovat, zda v Pythonu existuje soubor nebo složka

Standardní knihovna Pythonu obsahuje většinu funkcí, které by vývojář potřeboval k vyřešení problému. V tomto tutoriálu se naučíte různé způsoby, jak zkontrolovat existenci souboru nebo adresáře pouze pomocí vestavěných modulů.

Kontrola, zda je soubor nebo skript na správném místě, je zásadní pro jakýkoli program CLI. Váš program by se mohl stát zbytečným, pokud v okamžiku spuštění není na místě konkrétní soubor.

V dnešním tutoriálu se naučíte několik rychlých způsobů, jak zkontrolovat, zda soubor nebo složka v Pythonu existuje.

Před začátkem

Před provedením jakéhokoli níže uvedeného příkazu se ujistěte, že máte ve svém systému nainstalovaný Python 3. Otevřete terminál a zadejte následující příkaz:

python --version
# Python 3.9.5, my result

Pokud máte verzi 2.x, budete muset použít příkaz „python3“. Pokud nemáte nainstalovaný Python 3, podívejte se na naši instalační příručku Pythonu.

Spolu s tímto výukovým programem budeme používat některé testovací soubory, takže nezapomeňte vytvořit následující soubory:

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

Výše uvedené příkazy vytvoří soubor pro hraní, testovací adresář a další soubor uvnitř testovacího adresáře. Soubory mohou být prázdné, protože nebudeme muset číst jejich obsah,

Poznámka: Pokud používáte Windows, nastavte tuto jednoduchou strukturu souborů pomocí grafického správce souborů.

Nakonec budeme používat Ipython jako náš interaktivní Python shell, který poskytuje hezké rozhraní pro práci. Jedná se pouze o zboží, proto není nezbytně nutné.

pip install ipython

Poté, co to uděláte, získáte přístup ke krásnému Python shellu pouhým zadáním ipython.

Nyní jste připraveni, pojďme se ponořit do způsobů, jak zkontrolovat, zda složka nebo soubor v Pythonu existuje.

Zkuste, Otevřít a Mimo

Toto je nejpřímější možnost. Pokud se pokusíte otevřít soubor, který neexistuje, Python vyvolá a FileNotFoundError.

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

Můžeme toho využít a zpracovat výjimku v případě, že soubor, který hledáme, neexistuje.

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

Ve výše uvedeném kódu tiskneme vlastní zprávu a zastavujeme provádění programu, pokud soubor neexistuje.

  Jak ručně přidat hru do GeForce Experience

Všimněte si, jak se funkce exit() provede pouze v případě, že je vyvolána výjimka. Podívejme se, co se stane, když hledaný soubor skutečně existuje.

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

Všimněte si, jak zavíráme soubor hned po jeho otevření. Je to považováno za dobrou praxi podle Python dokumentace.

Volání file.write() bez použití klíčového slova s nebo volání file.close() může vést k tomu, že argumenty file.write() nebudou zcela zapsány na disk, i když se program úspěšně ukončí.

I když do souboru nezapisujeme, velmi se doporučuje soubor zavřít, protože by to mohlo vést k více problémů s výkonem.

Pokud nechceme soubor zavřít sami, můžeme použít kontextový manažer with. Přesně přiděluje a uvolňuje zdroje, takže nebudeme muset soubor zavírat.

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

Tato metoda je extrémně užitečná při zápisu do souborů, ale je neefektivní, pokud chceme pouze zkontrolovat, zda soubor existuje. Pojďme se ponořit do dalších možností, jak toho dosáhnout.

os.path.exists()

The os modul poskytuje mnoho funkcí pro interakci s operačním systémem. Pro kontrolu, zda soubor nebo složka existuje, můžeme použít funkci path.exists(), která akceptuje cestu k souboru nebo adresáři jako argument. Vrací boolean na základě existence cesty.

Poznámka: Cesta je jedinečné umístění souboru nebo adresáře v souborovém systému

V Pythonu je os.cesta submodul obsahuje funkce určené výhradně pro práci s cestami k souborům. Všechny tyto funkce přijímají argument cesty jako řetězce nebo bajty a můžete se rozhodnout pracovat s absolutními cestami, například:

/home/daniel/.bashrc

Nebo s relativními cestami v závislosti na adresáři, ve kterém skript spouštíte:

.bashrc
# Running the script in my home folder

Zde je několik příkladů použití funkce os.path.exists() spuštěné v adresáři, kde jsou umístěny mé testovací soubory:

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

Jak můžete vidět, vrací True při testování se souborem testfile.txt a složkou testdirectory a False, když soubor neexistuje.

  Jak změnit ovládání detekce uší a dotyku na AirPodu

os.path.isfile()

Pokud byste chtěli pouze dokázat existenci souboru (ne adresáře), zavolali byste funkci 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

Poznámka: V UNIXu končí všechny adresáře dopředným lomítkem (/), zatímco ve Windows používáme zpětné lomítko ().

V kódu nad funkcí isfile() vrací False při dvou příležitostech, podívejme se proč:

  • testdirectory/ je adresář, proto není považován za soubor. To není absolutně pravda, protože v Linuxu vše je deskriptor souboruale Python zachází s adresáři jinak jen pro pohodlí (Pokud se pokusíte otevřít adresář, dostanete IsADirectoryError)
  • i-dont-even-exist ukazuje na soubor, který ironicky neexistuje

os.path.isdir()

Pokud chcete zkontrolovat, zda je adresář na správném místě, budete muset použít funkci os.path.isdir(), která vrací True pouze v případě, že daná cesta ukazuje na adresář.

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

Všimněte si, jak výše uvedené příklady vrátí hodnotu False, i když cesta ukazuje na soubor, který existuje.

Glob

The glob modul poskytuje funkce, se kterými lze pracovat Unixové vzory podobné shellu (proto nefunguje správně ve Windows). Chcete-li zkontrolovat, zda soubor odpovídá vzoru v aktuálním adresáři, můžete použít glob.glob() funkce.

In [1]: import glob

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

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

Ve výše uvedeném kódu je vzor předaný funkci glob normální řetězec, který představuje cestu k testovacímu souboru a adresáři. Protože existují obě cesty, funkce vrátí seznam s odpovídajícími cestami uvnitř.

Poznámka: Pokud se vzor neshoduje, dostanete prázdný seznam.

Vzhledem k tomu, že můžeme předat vzory funkci glob, proč nevyzkoušet některé z jejích hlavních výhod?

Níže uvedený kód získá všechny cesty k souborům s příponou .txt a .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']

Použití třídy Path

The Třída cesty je jedním z nejlepších způsobů práce s cestami, protože nám poskytuje čisté rozhraní pro práci s cestami k souborům jako objekty.

  Jak chránit buňky před úpravami v Tabulkách Google

Třešničkou na dortu je, že instance Path mají všechny metody, které potřebujete k získání informací o určité cestě. To zahrnuje podobné funkce jako předchozí možnosti.

Poznámka: K použití knihovny pathlib budete potřebovat Python 3.4 nebo vyšší

Metody cesty, které použijete:

Zkontrolujte, zda existuje cesta

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

Funguje stejně jako os.path.exists().

Zkontrolujte, zda cesta ukazuje na soubor

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

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

Ekvivalent os.path.isfile().

Zkontrolujte, zda cesta ukazuje na adresář

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

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

Odpovídá os.path.isdir().

podproces

Pokud jste milovníkem modulů podprocesů, musíte o této možnosti vědět. Můžete určit, zda soubor nebo složka existuje, pomocí testovací příkaz.

Poznámka: Příkaz test funguje pouze v Unixu.

Následující testovací příznaky dokončí práci:

  • test -e: Zkontroluje, zda existuje cesta
  • test -f: Zkontroluje, zda soubor existuje
  • test-d: Zkontrolujte, zda existuje složka

V případě, že se chcete ponořit do více testovacích příznaků, můžete si přečíst příručku spuštěním:

man test

Kontrola cesty pomocí podprocesu:

Níže uvedený kód určuje, zda cesta existuje, porovnáním návratového kódu podprocesu s 0.

Pamatujte, že v Linuxu, pokud proces proběhl dobře, vrátí nulu, pokud ne, vrátí jakýkoli jiný kód.

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

V prvním příkazu importujeme modul podprocesu a poté pomocí spustit funkci a získání jeho návratového kódu.

Ověření existence souboru s podprocesem

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

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

Kontrola adresáře pomocí podprocesu:

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

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

Nedoporučuje se používat tuto možnost, protože spotřebovává více zdrojů a nezískáváme z ní žádnou výhodu.

Abych to shrnul

Python je jedním z nejpoužívanějších programovacích jazyků pro automatizaci procesů interakcí s OS. Jedna skvělá věc, kterou s tím můžete udělat, je zkontrolovat, zda soubor nebo složka existuje.

Nejjednodušší je:

  • Okamžité otevírání a zpracování výjimek souborů
  • Pomocí funkce exists() modulů os.path nebo pathlib.

V tomto tutoriálu jste se naučili:

  • Jak otevřít soubor a zpracovat výjimky v případě, že neexistuje
  • Význam cest
  • 3 různé funkce, které submodul os.path poskytuje pro kontrolu existence souboru nebo složky
  • Unix používá dopředná lomítka (/), zatímco Windows používá zpětná lomítka ()

Dále čtěte: Co je podproces v Pythonu? [5 Usage Examples]