Rozdział 15 · Python i akta

Błędy systemu plików

Operacje na plikach odwołują się do świata zewnętrznego — a świat zewnętrzny nie zawsze odpowiada tak, jakby się chciało.

Częste błędy systemu plików

WyjątekKiedy powstaje
FileNotFoundErrorścieżka nie istnieje, a operacja czekała na istniejący plik
FileExistsErrortryb „x”
PermissionErrornie ma uprawnień do odczytu/zapisu na tej ścieżce
IsADirectoryErrorścieżka to folder, a operacja czekała na plik
NotADirectoryErrorścieżka to plik, a operacja czekała na folder
UnicodeDecodeErrorbajtów nie można odkodować przy użyciu wybranego kodowania (15.16)
wspólnym przodkiem jest OSError
Większość wyjątków plików to warianty OSError. Nie jest konieczne znajomość całej hierarchii klas wyjątków — wystarczy pewnie rozpoznać powyższe klasy po nazwie i zrozumieć, kiedy każda z nich się pojawia.

Checklista: plik nie znaleziono

  1. Co teraz jest CWD? (Path.cwd(), rozdział 15.7)
  2. Jaka dokładnie ścieżka została zbudowana w kodzie?
  3. Czy istnieje folder nadrzędny tej ścieżki?
  4. Czy jest literówka w nazwie?
  5. Czy ścieżka jest absolutna czy względna, i względna do czego?
  6. Czy sprawa w nazwie pliku jest taka sama?
Sprawa dotycząca nazwy pliku to nie jest drobnostka
Zachowanie wrażliwości na wielkie litery różni się w zależności od systemu plików. Nie zakładaj, że Data.txt oraz data.txt musi być tym samym plikiem: napisz kod tak, aby nazwa była idealna.
Debug Lab 11: Otwórz folder jako plik
papka_kak_fajl.py
from pathlib import Path

Path("arhiv").mkdir(exist_ok=True)
with open("arhiv", "r", encoding="utf-8") as f:   #„arhiv”
    print(f.read())
Traceback (most recent call last):
IsADirectoryError: [Errno 21] Is a directory: 'arhiv'
Co widać na ekranie

"arhiv" — folder, a nie plik, i nie można go otworzyć jako pliku do odczytu tekstu. Przed otwarciem warto było sprawdzić .is_file().

Poprawiony kod
proverka_pered_otkrytiem.py
from pathlib import Path

path = Path("arhiv")
if path.is_file():
    with path.open("r", encoding="utf-8") as f:
        print(f.read())
else:
    print(f"{path} — nie zwykły plik")

Radzić sobie dokładnie z takim błędem, jakiego się spodziewasz

targeted_except.py
from pathlib import Path

path = Path("nastroyki.json")
try:
    text = path.read_text(encoding="utf-8")
except FileNotFoundError:
    print(„Nie znaleziono pliku ustawień – użyj wartości domyślnych”)
    text = "{}"
Nigdy nie except: pass
Puste przechwytywanie wszystkich wyjątków z rzędu po cichu ukrywa prawdziwe problemy programu. Złap konkretny oczekiwany wyjątek — jak FileNotFoundError wyżej — i nie wszystko w rzędzie.

Trochę głębiej: EAFP i LBYL

Dwa style: sprawdź wcześniej (if path.exists():) lub próbować poradzić sobie z błędem (try/except). W Python operacje plikowe często zapisywane są w drugi sposób, właśnie dlatego, że stan System plików może zmieniać się między sprawdzaniem a samą operacją (Rozdział 15.19). Pamiętaj Same angielskie skróty nie są konieczne — idea jest ważna.

Praktyka: błędy systemu plików
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →