7 sposobów na sprawdzenie, czy plik lub folder istnieje w Pythonie
Opublikowany: 2021-06-16Biblioteka standardowa Pythona zawiera większość funkcji, których programista potrzebowałby, aby rozwiązać problem. W tym samouczku poznasz różne sposoby sprawdzania istnienia pliku lub katalogu przy użyciu tylko wbudowanych modułów.
Sprawdzenie, czy plik lub skrypt znajduje się we właściwym miejscu, ma kluczowe znaczenie 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 poniższego polecenia 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 resultJeśli masz wersję 2.x, musisz użyć polecenia „python3”. Sprawdź nasz przewodnik po instalacji Pythona, jeśli nie masz zainstalowanego Pythona 3.
Wraz z tym samouczkiem będziemy używać niektórych plików testowych, więc upewnij się, że utworzyłeś następujące pliki:
touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txtPowyższe polecenia tworzą plik do zabawy, katalog testowy i inny plik w katalogu testing . Pliki mogą być puste, ponieważ nie będziemy musieli czytać ich zawartości,
Uwaga: Jeśli korzystasz z systemu Windows, skonfiguruj prostą strukturę plików za pomocą graficznego menedżera plików.
Na koniec użyjemy Ipythona jako naszej interaktywnej powłoki Pythona, która zapewnia ładny interfejs do pracy. To tylko towar, dlatego nie jest to bezwzględnie konieczne.
pip install ipythonPo wykonaniu tej czynności uzyskasz dostęp do pięknej powłoki Pythona, wpisując ipython .

Teraz wszystko gotowe, przejdźmy do sposobów sprawdzania, czy folder lub plik istnieje w Pythonie.
Wypróbuj, otwórz i z wyjątkiem
To najprostsza opcja. Jeśli spróbujesz otworzyć plik, który nie istnieje, Python zgłosi błąd FileNotFoundError.
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 existW powyższym kodzie wyświetlamy 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, rzeczywiście 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. Zgodnie z dokumentacją Pythona jest to uważane za dobrą praktykę.
Wywołanie
<span class="pre">file.write()</span>bez użycia słowa kluczowego<span class="pre">with</span>lub wywołania<span class="pre">file.close()</span>może spowodować, że argumenty<span class="pre">file.write()</span>nie zostaną całkowicie zapisane na dysku, nawet jeśli program zakończy się pomyślnie.
Nawet jeśli nie zapisujemy do pliku, bardzo zalecane jest zamknięcie pliku, ponieważ może to prowadzić do wielu 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 musimy 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 przydatna podczas zapisywania plików, ale jest nieefektywna, jeśli chcemy tylko sprawdzić, czy plik istnieje. Przejdźmy do innych opcji, aby to osiągnąć.
os.ścieżka.istnieje()
Moduł os zapewnia wiele funkcji do interakcji z systemem operacyjnym. Aby sprawdzić, czy plik lub folder istnieje, możemy skorzystać ze ścieżki. Funkcja istnieje(), która jako argument przyjmuje ścieżkę do pliku lub katalogu. Zwraca wartość logiczną na podstawie istnienia ścieżki.
Uwaga: ścieżka to unikalna lokalizacja pliku lub katalogu w systemie plików
W Pythonie podmoduł os.path zawiera funkcje przeznaczone wyłącznie do działania ze ścieżkami plików. Wszystkie te funkcje akceptują argument ścieżki jako ciągi lub bajty i możesz zdecydować się na pracę ze ścieżkami bezwzględnymi, na przykład:
/home/daniel/.bashrcLub ze ścieżkami względnymi, w zależności od katalogu, w którym uruchamiasz skrypt:
.bashrc # Running the script in my home folderOto 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]: FalseJak widać, to zwraca True podczas testowania z plikiem testfile.txt i folderu testdirectory i 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]: TrueUwaga: W UNIX wszystkie katalogi kończą się ukośnikiem (/), podczas gdy w 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 uważany za plik. Nie jest to do końca prawdą, ponieważ w Linuksie wszystko jest deskryptorem pliku, ale Python traktuje katalogi inaczej tylko dla wygody (jeśli spróbujesz otworzyć katalog, otrzymasz IsADirectoryError ) -
i-dont-even-existwskazuje na plik, który jak na ironię nie istnieje
os.ścieżka.isdir()
Jeśli chcesz sprawdzić, czy katalog jest 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]: FalseZwróć uwagę, że powyższe przykłady zwracają wartość False, nawet jeśli ścieżka wskazuje na istniejący plik.
Glob
Moduł glob udostępnia funkcje do pracy z wzorcami podobnymi do powłoki uniksowej (dlatego nie działa poprawnie w systemie Windows). Aby sprawdzić, czy plik pasuje do wzorca w bieżącym katalogu, możesz użyć funkcji glob.glob().
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 normalnym ciągiem znaków, który reprezentuje ścieżkę do pliku testowego i katalogu. Ponieważ istnieją obie ścieżki, funkcja zwraca listę zawierającą pasujące nazwy ścieżek.
Uwaga: Jeśli wzór 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 rozszerzeniem odpowiednio .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 ścieżki
Klasa Path jest jednym z najlepszych sposobów pracy ze ścieżkami, ponieważ zapewnia 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 funkcje podobne do poprzednich opcji.
Uwaga: do korzystania z biblioteki pathlib będziesz potrzebować Pythona 3.4 lub nowszego
Metody ścieżki, których będziesz używać:
- Ścieżka().istnieje()
- Ścieżka().is_file()
- Path().is_dir()
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]: TrueDział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]: FalseOdpowiednik 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]: TrueOdpowiada 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 polecenia test.
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 testSprawdzanie ścieżki z podprocesem:
Poniższy kod określa, czy ścieżka istnieje, porównując kod powrotu podprocesu z 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]: FalseW pierwszej instrukcji importujemy moduł podprocesu, następnie używamy funkcji run i pobieramy jego kod powrotu.
Weryfikacja istnienia pliku z podprocesem
In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: FalseSprawdzanie katalogu z podprocesem:
In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: TrueKorzystanie z tej opcji nie jest zalecane, ponieważ zużywa więcej zasobów i nie uzyskujemy z niej żadnej 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ą z fajnych rzeczy, które możesz z tym zrobić, jest sprawdzenie, czy istnieje plik lub folder.
Najprostsze, aby to zrobić, to:
- Natychmiastowe otwieranie i obsługa wyjątków plików
- Korzystanie z funkcji existing () w modułach os.path lub pathlib .
W tym samouczku nauczyłeś się:
- Jak otworzyć plik i obsługiwać wyjątki, jeśli nie istnieje?
- Znaczenie ścieżek
- 3 różne funkcje podmodułu os.path do sprawdzania istnienia pliku lub folderu
- Unix używa ukośników (/), podczas gdy Windows używa ukośników odwrotnych (\)
Następnie przeczytaj: Co to jest podproces w Pythonie? [5 przykładów użycia]
