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 with
instrukcji 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?
open
nie powiedzie, wyjątek zostanie zgłoszony przedtry/finally
nawet wprowadzeniem bloku. Więcclose
nie zostanie wywołany. (Dlatego powinieneś zadzwonićopen
przedtry
.)open
zgłoszeniu wyjątku.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()
źródło
with open(...)
to zdecydowanie najlepszy wybór we współczesnym Pythonie.Nie ma potrzeby zamykania pliku zgodnie z dokumentami, jeśli używasz z:
>>> 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
źródło
Oto przykład podany, który tak, jak używać
open
i „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.
źródło
open
ale przedclose
, plik nie zostanie poprawnie zamknięty przy użyciu tego podejścia. Używaniewith
lubtry
/finally
zamyka plik poprawnie, nawet w obecności wyjątków.