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ątek | Kiedy powstaje |
|---|---|
FileNotFoundError | ścieżka nie istnieje, a operacja czekała na istniejący plik |
FileExistsError | tryb „x” |
PermissionError | nie 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 |
UnicodeDecodeError | bajtó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
- Co teraz jest CWD? (
Path.cwd(), rozdział 15.7) - Jaka dokładnie ścieżka została zbudowana w kodzie?
- Czy istnieje folder nadrzędny tej ścieżki?
- Czy jest literówka w nazwie?
- Czy ścieżka jest absolutna czy względna, i względna do czego?
- 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'
"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