Jeśli chodzi o moje poprzednie pytanie , zauważyłem, że w obu odpowiedziach, które korzystały z tej open()
funkcji, nie było mowy o zamknięciu pliku.
Czytałem, że jest to dobra praktyka, ale czy rzeczywiście jest to potrzebne? Czy to tylko niepotrzebny kod?
Czy plik jest zamykany automatycznie?
with open (file_name, ...) as variable:
automatycznie wywołujeclose()
metodę natychmiast po opuszczeniu tego bloku kodu.python3
pliku plik jest automatycznie niszczony, gdy nie ma już żadnych odniesień.Odpowiedzi:
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:
close()
metodęfile
obiektu jawnie lub niejawnie, opuszczającwith 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!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.źródło
python3
nie istnieje, a odpowiedź jest nieaktualna. Automatyczne usuwanie śmieci istnieje bez powodu i działa idealnie. Minęły lata, odkądclose()
specjalnie go użyłem . Nigdy nie wystąpił pojedynczy błąd spowodowany nieużywaniem go.