7 sposobów sprawdzenia, czy plik lub folder istnieje w Pythonie

Standardowa biblioteka Pythona zawiera większość funkcji potrzebnych programiście do rozwiązania problemu. W tym samouczku poznasz różne sposoby sprawdzania istnienia pliku lub katalogu przy użyciu wyłącznie wbudowanych modułów.

Sprawdzenie, czy plik lub skrypt znajduje się we właściwym miejscu, jest kluczowe dla każdego programu CLI. Twój program może stać się bezużyteczny, jeśli w momencie wykonywania nie ma określonego pliku.

W dzisiejszym samouczku nauczysz się kilku szybkich sposobów sprawdzania, czy plik lub folder istnieje w Pythonie.

Przed rozpoczęciem

Przed wykonaniem dowolnego polecenia poniżej upewnij się, że masz zainstalowany Python 3 w swoim systemie. Otwórz terminal i wpisz następujące polecenie:

python --version
# Python 3.9.5, my result

Jeśli masz wersję 2.x, musisz użyć polecenia „python3”. Sprawdź nasz przewodnik instalacji Pythona, jeśli nie masz zainstalowanego Pythona 3.

W tym samouczku będziemy używać niektórych plików testowych, więc pamiętaj o utworzeniu następujących plików:

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

Powyższe polecenia tworzą plik do gry, katalog testowy i inny plik w katalogu testowym. Pliki mogą być puste, ponieważ nie będziemy musieli czytać ich zawartości,

Uwaga: jeśli używasz systemu Windows, skonfiguruj prostą strukturę pliku za pomocą graficznego menedżera plików.

W końcu będziemy używać Ipyton jako naszą interaktywną powłokę Pythona, która zapewnia ładny interfejs do pracy. Jest to tylko towar, a zatem nie jest bezwzględnie konieczny.

pip install ipython

Po wykonaniu tej czynności uzyskasz dostęp do pięknej powłoki Pythona, wpisując po prostu ipython.

Teraz wszystko gotowe, przejdźmy do sposobów sprawdzenia, czy folder lub plik istnieje w Pythonie.

Spróbuj, otwórz i wyjątek

To najprostsza opcja. Jeśli spróbujesz otworzyć plik, który nie istnieje, Python zgłosi a Błąd pliku nie znaleziono.

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

Możemy to wykorzystać i obsłużyć wyjątek w przypadku, gdy plik, którego szukamy, nie istnieje.

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

W powyższym kodzie drukujemy niestandardowy komunikat i zatrzymujemy wykonywanie programu, jeśli plik nie istnieje.

Zwróć uwagę, że funkcja exit() zostanie wykonana tylko wtedy, gdy zostanie zgłoszony wyjątek. Zobaczmy, co się stanie, gdy plik, którego szukamy, faktycznie istnieje.

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

Zwróć uwagę, jak zamykamy plik zaraz po jego otwarciu. Jest to uważane za dobrą praktykę zgodnie z Dokumentacja Pythona.

Wywołanie file.write() bez użycia słowa kluczowego with lub wywołania file.close() może spowodować, że argumenty file.write() nie zostaną w całości zapisane na dysku, nawet jeśli program zakończy się pomyślnie.

Nawet jeśli nie piszemy do pliku, bardzo zalecane jest zamknięcie pliku, ponieważ może to prowadzić do wiele problemów z wydajnością.

Jeśli nie chcemy sami zamykać pliku, możemy skorzystać z menedżera kontekstu. Precyzyjnie przydziela i zwalnia zasoby, dzięki czemu nie będziemy musieli zamykać pliku.

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

Ta metoda jest niezwykle użyteczna przy zapisywaniu w plikach, ale jest nieefektywna, jeśli chcemy tylko sprawdzić, czy plik istnieje. Zanurzmy się w inne opcje, aby to osiągnąć.

os.ścieżka.istnieje()

The moduł systemu operacyjnego zapewnia wiele funkcji do interakcji z systemem operacyjnym. Aby sprawdzić, czy plik lub folder istnieje, możemy użyć funkcji path.exists(), która jako argument przyjmuje ścieżkę do pliku lub katalogu. Zwraca wartość logiczną opartą na istnieniu ścieżki.

Uwaga: Ścieżka to unikalna lokalizacja pliku lub katalogu w systemie plików

W Pythonie tzw os.ścieżka submoduł zawiera funkcje przeznaczone wyłącznie do pracy ze ścieżkami plików. Wszystkie te funkcje akceptują argument ścieżki w postaci łańcuchów znaków lub bajtów i możesz zdecydować się na pracę ze ścieżkami bezwzględnymi, na przykład:

/home/daniel/.bashrc

Lub ze ścieżkami względnymi, w zależności od katalogu, w którym uruchamiasz skrypt:

.bashrc
# Running the script in my home folder

Oto wiele przykładów użycia funkcji os.path.exists() działającej w katalogu, w którym znajdują się moje pliki testowe:

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 widać, zwraca True podczas testowania z plikiem testfile.txt i folderem testdirectory oraz False, gdy plik nie istnieje.

os.ścieżka.isfile()

Gdybyś chciał tylko udowodnić istnienie pliku (nie katalogu), wywołałbyś funkcję 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

Uwaga: W systemie UNIX wszystkie katalogi kończą się ukośnikiem (/), podczas gdy w systemie Windows używamy ukośnika odwrotnego ().

W powyższym kodzie funkcja isfile() zwraca False w dwóch przypadkach, zobaczmy dlaczego:

  • testdirectory/ jest katalogiem, dlatego nie jest traktowany jako plik. Nie jest to do końca prawdą, ponieważ w Linuksie wszystko jest deskryptorem plikuale Python traktuje katalogi inaczej tylko dla wygody (jeśli spróbujesz otworzyć katalog, otrzymasz IsADirectoryError)
  • i-dont-even-exist wskazuje na plik, który jak na ironię nie istnieje

os.ścieżka.isdir()

Jeśli chcesz sprawdzić, czy katalog znajduje się we właściwym miejscu, musisz użyć funkcji os.path.isdir(), która zwraca True tylko wtedy, gdy podana ścieżka wskazuje na katalog.

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

Zwróć uwagę, że powyższe przykłady zwracają wartość False, nawet jeśli ścieżka wskazuje na istniejący plik.

Glob

The kula ziemska moduł zapewnia funkcje do pracy Wzorce podobne do powłoki systemu Unix (stąd nie działa poprawnie w systemie Windows). Aby sprawdzić, czy plik pasuje do wzorca w bieżącym katalogu, możesz użyć metody glob.glob() funkcjonować.

In [1]: import glob

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

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

W powyższym kodzie wzorzec przekazany do funkcji glob jest zwykłym ciągiem znaków reprezentującym ścieżkę do pliku i katalogu testowego. Ponieważ istnieją obie ścieżki, funkcja zwraca listę zawierającą pasujące nazwy ścieżek.

Uwaga: Jeśli wzorzec nie pasuje, otrzymasz pustą listę.

Biorąc pod uwagę, że możemy przekazywać wzorce do funkcji glob, dlaczego nie przetestować niektórych z jej głównych zalet?

Poniższy kod pobiera wszystkie ścieżki plików z odpowiednio rozszerzeniami .txt i .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']

Korzystanie z klasy Path

The Klasa ścieżki jest jednym z najlepszych sposobów pracy ze ścieżkami, ponieważ zapewnia nam przejrzysty interfejs do pracy ze ścieżkami plików jako obiektami.

Wisienką na torcie jest to, że instancje Path mają wszystkie metody potrzebne do uzyskania informacji o określonej ścieżce. Obejmuje to podobne funkcjonalności do poprzednich opcji.

Uwaga: do korzystania z biblioteki pathlib potrzebny jest język Python w wersji 3.4 lub nowszej

Metody ścieżki, których będziesz używać:

Sprawdź, czy ścieżka istnieje

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

Działa tak samo jak os.path.exists().

Sprawdź, czy ścieżka wskazuje na plik

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

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

Odpowiednik os.path.isfile().

Sprawdź, czy ścieżka wskazuje na katalog

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

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

Odpowiada funkcji os.path.isdir().

podproces

Jeśli jesteś miłośnikiem modułów podprocesów, musisz wiedzieć o tej opcji. Możesz określić, czy plik lub folder istnieje, używając polecenie testowe.

Uwaga: Polecenie test działa tylko w systemie Unix.

Następujące flagi testowe wykonają zadanie:

  • test -e: Sprawdź, czy ścieżka istnieje
  • test -f: Sprawdź, czy plik istnieje
  • test-d: Sprawdź, czy folder istnieje

Jeśli chcesz zagłębić się w więcej flag testowych, możesz przeczytać instrukcję, uruchamiając:

man test

Sprawdzanie ścieżki za pomocą podprocesu:

Poniższy kod określa, czy ścieżka istnieje, porównując kod powrotu podprocesu z wartością 0.

Pamiętaj, że w Linuksie, jeśli proces przebiegł pomyślnie, zwróci zero, jeśli nie, zwróci inny kod.

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

W pierwszej instrukcji importujemy moduł subprocess, a następnie używamy uruchomić funkcję i uzyskanie kodu powrotu.

Weryfikacja istnienia pliku za pomocą subprocess

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

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

Sprawdzanie katalogu za 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

Nie zaleca się korzystania z tej opcji, ponieważ zużywa ona więcej zasobów i nie uzyskujemy z niej żadnych korzyści.

Podsumowując

Python jest jednym z najczęściej używanych języków programowania do automatyzacji procesów poprzez interakcję z systemem operacyjnym. Jedną fajną rzeczą, którą możesz z tym zrobić, jest sprawdzenie, czy plik lub folder istnieje.

Najłatwiej to zrobić:

  • Natychmiastowe otwieranie i obsługa wyjątków plików
  • Korzystanie z funkcji ist() modułów os.path lub pathlib.

W tym samouczku nauczyłeś się:

  • Jak otworzyć plik i obsługiwać wyjątki w przypadku, gdy nie istnieje
  • Znaczenie ścieżek
  • 3 różne funkcje zapewnia submoduł os.path do sprawdzania istnienia pliku lub folderu
  • Unix używa ukośników do przodu (/), podczas gdy Windows używa ukośników odwrotnych ()

Następny artykuł: Co to jest podproces w Pythonie? [5 Usage Examples]