Wyjątek, zamykanie pliku i with
Możesz być ciekawy czy with na pewno zamyka plik, w przypadku gdy wystąpi wyjątek 😉
I słusznie! Możemy to łatwo przetestować za pomocą prostej konstrukcji try… except. Utwórz nowy skrypt o nazwie write_file_safe_with.py w katalogu głównym projektu.
Przygotowanie kodu
Umieść w pliku write_file_safe_with.py następującą zawartość:
try:
# tutaj umieść operacje na pliku
except Exception as e:
print(f'Exception: {e}')
finally:
print(f'In block "finally". Is file closed? {file.closed}')
W bloku finally mamy print() za pomocą którego wypiszemy na konsoli informację, czy plik jest zamknięty. Ta informacja jest zawarta w atrybucie file.closed.
Skorzystajmy teraz ze zmodyfikowanego przykładu z with gdzie chcemy coś zapisać do pliku otwartego w trybie tylko do odczytu:
with open("./testFiles/fileToWriteWith.txt", mode='r') as file:
file.write('Hello jaktestowac.pl!')
Jeśli umieścimy powyższy kod w bloku try to całość przyjmie postać:
try:
with open("./testFiles/fileToWriteWith.txt", mode='r') as file:
file.write('Hello jaktestowac.pl!')
except Exception as e:
print(f'Exception: {e}')
finally:
print(f'In block "finally". Is file closed? {file.closed}')
Zauważ, że plik jest otwierany jako tylko do odczytu, gdyż tryb dostępu ustawiony jest na mode='r'. Ma to za zadanie wywołanie wyjątku 😉
Testy with i wyjątku
Upewnij się, że plik fileToWriteWith.txt istnieje. Następnie uruchom skrypt write_file_safe_with.py. Czy wynik jest zgodny z oczekiwanymi? 😉 Na konsoli powinniśmy ujrzeć:
Exception: not writable In block "finally". Is file closed? True
Jak widzisz, nawet w przypadku wystąpienia wyjątku, plik zostaje zamknięty 😉 Konstrukcja with znacznie upraszcza i ułatwia działania związane z operacjami na plikach 🙂
Podsumowanie
Instrukcja with posiada wiele niewątpliwych zalet:
- Nie trzeba się martwić o zamykanie plików. Po zakończeniu wszystkich operacji zawartych w instrukcji
withużywane pliki są automatycznie zamykane. - Instrukcji
withnie trzeba otaczać wyrażeniemtry... except– gdy wystąpi wyjątek. Plik i tak zostanie poprawnie zamknięty.
with, to zajrzyj do oficjalnej dokumentacji Compound statements – The with statement. My w kolejnych lekcjach pokryjemy najważniejsze i najczęściej używane zagadnienia związane z with 😉
