Jak bezpiecznie otwierać / zamykać pliki w Pythonie 2.4

86

Obecnie piszę mały skrypt do użycia na jednym z naszych serwerów przy użyciu Pythona. Na serwerze jest zainstalowany tylko Python 2.4.4.

Nie zacząłem używać Pythona, dopóki 2.5 nie wyszedł, więc jestem przyzwyczajony do formularza:

with open('file.txt', 'r') as f:
    # do stuff with f

Jednak nie ma withinstrukcji przed wersją 2.5 i mam problem ze znalezieniem przykładów prawidłowego sposobu ręcznego czyszczenia obiektu pliku.

Jaka jest najlepsza praktyka bezpiecznego usuwania obiektów plików w przypadku korzystania ze starszych wersji języka Python?

TM.
źródło

Odpowiedzi:

139

Zobacz docs.python.org :

Kiedy skończysz z plikiem, wywołaj f.close (), aby go zamknąć i zwolnić wszelkie zasoby systemowe zajmowane przez otwarty plik. Po wywołaniu f.close () próby użycia obiektu pliku będą automatycznie kończyć się niepowodzeniem.

Dlatego używaj close()elegancko z try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

Gwarantuje to, że nawet jeśli zgłosi # do stuff with fwyjątek, fnadal będzie prawidłowo zamknięty.

Należy pamiętać, że openpowinien pojawić się na zewnątrz z try. Jeśli opensamo zgłasza wyjątek, plik nie został otwarty i nie trzeba go zamykać. Ponadto, jeśli openwywołuje wyjątek, jego wynik nie jest przypisywany fi wywołanie jest błędem f.close().

Jon-Eric
źródło
Bardzo proste, dzięki. Z jakiegoś powodu spodziewałem się, że będę potrzebować czegoś bardziej zaangażowanego.
TM.
16
Jeśli się opennie powiedzie, wyjątek zostanie zgłoszony przed try/finallynawet wprowadzeniem bloku. Więc closenie zostanie wywołany. (Dlatego powinieneś zadzwonić openprzed try.)
FogleBird
1
@TM Dodałem uwagę o openzgłoszeniu wyjątku.
Jon-Eric,
4
To jest to, co oświadczenie with przekłada się na kulisy.
Arlaharen,
1
Otwarcie pliku powinno nastąpić podczas próby.
Anthony Rutledge
32

W powyższym rozwiązaniu, powtórzone tutaj:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

jeśli wydarzy się coś złego (nigdy nie wiadomo ...) po pomyślnym otwarciu pliku i przed próbą plik nie zostanie zamknięty, dlatego bezpieczniejszym rozwiązaniem jest:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()
mljrg
źródło
Używanie z otwartą (...) oświadczenie, plik bez względu na to, w jaki sposób z bloku jest zakończona (nawet z wyjątkiem) jest zamknięty
darkgaze
@darkgaze with open(...)to zdecydowanie najlepszy wybór we współczesnym Pythonie.
mljrg,
11

Nie ma potrzeby zamykania pliku zgodnie z dokumentami, jeśli używasz z:

Podczas pracy z obiektami plików dobrą praktyką jest używanie słowa kluczowego with. Ma to tę zaletę, że plik jest poprawnie zamykany po zakończeniu jego pakietu, nawet jeśli po drodze zostanie zgłoszony wyjątek. Jest również znacznie krótszy niż pisanie równoważnych bloków try-last:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Więcej tutaj: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

user3765030
źródło
Jest to zarówno poprawne, jak i nieświadome pytania.
Jon-Eric
-4

Oto przykład podany, który tak, jak używać openi „pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

Konieczne jest, ile razy otwierałeś plik, aby zamknąć te razy.

Varun Chhangani
źródło
1
Jeśli wyjątek zostanie zgłoszony po, openale przed close, plik nie zostanie poprawnie zamknięty przy użyciu tego podejścia. Używanie withlub try/ finallyzamyka plik poprawnie, nawet w obecności wyjątków.
Jon-Eric