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: odpowiada file = open("./testFiles/fileToWrite.txt", mode='w') – czyli służy do otwarcia pliku i utworzenia obiektu file,
  • 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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *