Czy zamykanie pliku po otwarciu go za pomocą `open ()` jest wymagane w Pythonie? [Zamknięte]


9

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?


1
with open (file_name, ...) as variable:automatycznie wywołuje close()metodę natychmiast po opuszczeniu tego bloku kodu.
Bajt Dowódca


@ByteCommander, czy chcesz udzielić komentarza, aby pytanie zostało „rozwiązane”?
TellMeWhy

1
W python3pliku plik jest automatycznie niszczony, gdy nie ma już żadnych odniesień.
Jacob Vlijm

4
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ jest to ogólne pytanie dotyczące Pythona bez związku ze skryptami na Ubuntu. pyta o najlepsze praktyki w języku programowania.
terdon

Odpowiedzi:


9

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ę fileobiektu jawnie lub niejawnie, opuszczając with open(...):blok. Działa to oczywiście zawsze i na każdej implementacji języka Python.
  • fileostatnie 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 ext4deskryptor 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.


Nie do końca prawda dla python3 !!
Jacob Vlijm

@JacobVlijm Czy mógłbyś to wyjaśnić?
Bajt Dowódca

Zobacz komentarz pod pytaniem. Odpowiedź na temat „złej praktyki” w linku do Twojej odpowiedzi pochodzi z 2011 r. Jeśli kiedykolwiek istniała, ostrzeżenie python3nie istnieje, a odpowiedź jest nieaktualna. Automatyczne usuwanie śmieci istnieje bez powodu i działa idealnie. Minęły lata, odkąd close()specjalnie go użyłem . Nigdy nie wystąpił pojedynczy błąd spowodowany nieużywaniem go.
Jacob Vlijm

Soo ... Wiesz, czy inne implementacje, takie jak PyPy, Jython lub IronPython, zamykają pliki w taki sam sposób, jak CPython? A gdybym zabił tłumacza, nie miałby szansy zamknąć pliku, prawda? Myślę też, że limit otwartych plików nadal obowiązuje. A co z opróżnianiem zapisanych danych? Znasz tam coś jeszcze aktualnego?
Bajt Dowódca

1
@JacobVlijm Dzięki za wskazówkę. : P Moja maszyna już uległa awarii podczas tworzenia tego pliku ... Nawet do tego nie potrzebowałem Pythona.
Bajt Dowódca
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.