Instrukcja with
Twórcy Pythona dawno się zorientowali, że trzeba coś z zrobić z obsługą błędów w plikach. W wersji Python 2.5 (w 2006 roku) wprowadzono instrukcję with
. Jest to instrukcja, która znaczne upraszcza i udoskonala operacje na plikach.
Wykorzystanie instrukcji with?
Teraz zaprezentujemy najprostszy przykład użycia with
. W katalogu głównym projektu utwórz plik o nazwie write_file_with.py. Następnie umieść w nim poniższy kod:
with open("./testFiles/fileToWriteWith.txt", mode='w') as file: file.write('Hello jaktestowac.pl! Saved with with!')
Jest to najprostszy przykład wykorzystania instrukcji with
. Następuje w nim otwarcie pliku i zapisu do niego ciągu znaków 😉
W tym momencie możesz uruchomić skrypt write_file_with.py i sprawdzić rezultaty. Spodziewamy się, że w katalogu testFiles zostanie utworzony plik fileToWriteWith.txt o zawartości Hello jaktestowac.pl! Saved with with!.
Dla zobrazowania struktura katalogów po wykonaniu skryptu write_file_with.py:
C:\ +-- Projects | +-- pythonFiles | +-- testFiles | +-- fileToRead.txt | +-- fileToWrite.txt | +-- fileToWriteWith.txt | +-- venv | +-- read_file.py | +-- write_file.py | +-- write_file_safe.py | +-- write_file_with.py
Analiza instrukcji with?
Przeanalizujmy kod ze skryptu write_file_with.py:
with open("./testFiles/fileToWriteWith.txt", mode='w') as file: file.write('Hello jaktestowac.pl! Saved with with!')
i porównajmy go z zawartością write_file.py:
file = open("./testFiles/fileToWrite.txt", mode='w') file.write('Hello jaktestowac.pl!') file.close()
Analiza:
- linia
with open("./testFiles/fileToWriteWith.txt", mode='w') as file:
odpowiadafile = open("./testFiles/fileToWrite.txt", mode='w')
– czyli służy do otwarcia pliku i utworzenia obiektufile
, - linia
file.write('Hello jaktestowac.pl! Saved with with!')
jest już dobrze znana 😉 – odpowiada ona za zapis ciągu znaków do pliku.
W tym momencie powinno Tobie nasunąć się pytanie:
A gdzie jest wywołanie metody
close()
?
Ha! Nie ma i nie jest potrzebna 😀
Automatyczny close()
Przewagą konstrukcji with
nad klasycznym otwieraniem pliku jest fakt, iż przy użyciu with
nie potrzebujemy wywoływać metody close()
. Operacja zamknięcia pliku odbywa się automatycznie na końcu działania konstrukcji with
.
Możemy to bardzo łatwo sprawdzić dodając do write_file_with.py proste funkcje print()
, za pomocą których wypiszemy na konsoli stan obiektu file
:
with open("./testFiles/fileToWriteWith.txt", mode='w') as file: file.write('Hello jaktestowac.pl!') print(f'Inside with. Is file closed? {file.closed}') print(f'After with. Is file closed? {file.closed}')
Po uruchomieniu powinniśmy otrzymać na konsoli następujący komunikat:
Inside with. Is file closed? False After with. Is file closed? True
Z wyniku jasno możemy odczytać, że plik wewnątrz konstrukcji with
jest otwarty (wartość file.closed
wynosi False
). Natomiast zaraz po jej zakończeniu – zamknięty (wartość file.closed
wynosi True
) 😉
Przetestujmy jeszcze jeden przypadek z with
… mianowicie – wyjątki podczas operacji na plikach.