Kiedy pliki są zamykane?
Jak możemy się nauczyć z Czy jawne zamykanie plików jest ważne? (StackOverflow) interpreter języka Python zamyka plik w następujących przypadkach:
- ręcznie wywołujesz
close()
metodę file
obiektu jawnie lub niejawnie, opuszczając with open(...):
blok. Działa to oczywiście zawsze i na każdej implementacji języka Python.
file
ostatnie odwołanie do obiektu zostało usunięte i dlatego obiekt jest przetwarzany przez Garbage Collector. To nie jest funkcja językowa, ale specjalna funkcja tylko implementacji CPython, więc dla przenośności nie polegaj na tym!
- interpreter Pythona kończy się. W takim przypadku powinien zamknąć wszystkie otwarte uchwyty plików. Niektóre starsze wersje Python3 wydrukowałyby również ostrzeżenie, że powinieneś sam je zamknąć. Wyobraź sobie jednak awarię lub wymuszenie zabicia interpretera Pythona, a zobaczysz, że to również nie jest wiarygodne.
Tak więc tylko pierwsza (ręczna) metoda jest niezawodna!
Co by się stało, gdyby plik pozostał otwarty?
Po pierwsze, w zależności od implementacji interpretera języka Python, jeśli otworzyłeś plik z dostępem do zapisu, nie możesz być pewien, że twoje modyfikacje zostały wypłukane na dysk, dopóki ręcznie go nie indukujesz lub program obsługi plików nie zostanie zamknięty.
Po drugie, możesz otworzyć tylko ograniczoną liczbę plików w systemie na użytkownika. Jeśli przekroczysz ten limit, np. Otwierając wiele plików w pętli w programie Python bez zamykania ich tak szybko, jak to możliwe, system może odmówić otwarcia kolejnych uchwytów plików, a otrzymasz wyjątek. Może się również zdarzyć, że Twój program pobierze ostatni dozwolony otwarty plik i inny program zawiedzie, ponieważ zostanie odrzucony.
Po trzecie, otwieranie plików na urządzeniu wymiennym zapobiega jego odmontowaniu lub wysunięciu. Nadal możesz usunąć plik w niektórych systemach plików, takich jak ext4
deskryptor pliku / dowiązanie twarde do i-węzła pliku, które jest usuwane / odłączane, ale program, który otworzył plik, może nadal uzyskiwać dostęp do i-węzła przez własną tymczasową procedurę obsługi plików. Jest to np. Także mechanizm, który pozwala aktualizować pakiety podczas działania odpowiedniego oprogramowania. Jednak np. NTFS nie ma takiej funkcji. Może jednak nigdy nie zostać zmodyfikowany przez dwa współbieżne procesy, więc nadal będzie jakoś blokowany dla innych.
with open (file_name, ...) as variable:
automatycznie wywołujeclose()
metodę natychmiast po opuszczeniu tego bloku kodu.