Come aprire / chiudere file in modo sicuro in python 2.4


86

Attualmente sto scrivendo un piccolo script da utilizzare su uno dei nostri server utilizzando Python. Il server ha solo Python 2.4.4 installato.

Non ho iniziato a usare Python fino a 2.5, quindi sono abituato al modulo:

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

Tuttavia, non ci sono withistruzioni prima della 2.5 e ho problemi a trovare esempi sul modo corretto per pulire manualmente un oggetto file.

Qual è la procedura migliore per eliminare gli oggetti file in modo sicuro quando si utilizzano vecchie versioni di python?

Risposte:


139

Vedi docs.python.org :

Quando hai finito con un file, chiama f.close () per chiuderlo e liberare tutte le risorse di sistema occupate dal file aperto. Dopo aver chiamato f.close (), i tentativi di utilizzare l'oggetto file falliranno automaticamente.

Quindi utilizzare close()elegantemente con try/finally:

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

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

Ciò garantisce che, anche se # do stuff with fsolleva un'eccezione, fverrà comunque chiuso correttamente.

Nota che opendovrebbe apparire al di fuori del file try. Se esso openstesso solleva un'eccezione, il file non è stato aperto e non ha bisogno di essere chiuso. Inoltre, se opensolleva un'eccezione, il suo risultato non è assegnato fed è un errore chiamare f.close().


Molto semplice, grazie. Per qualche ragione mi aspettavo di aver bisogno di qualcosa di più coinvolto.
TM.

16
Se openfallisce, verrà sollevata un'eccezione prima ancora che il try/finallyblocco venga inserito. Quindi closenon verrà chiamato. (Ecco perché dovresti chiamare openprima del try.)
FogleBird

1
@TM Ho aggiunto una nota sulla segnalazione di openun'eccezione.
Jon-Eric,

4
Questo è ciò che la dichiarazione with si traduce dietro le quinte.
Arlaharen

1
L'apertura del file dovrebbe avvenire durante il tentativo.
Anthony Rutledge,

32

Nella soluzione sopra, ripetuta qui:

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

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

se succede qualcosa di brutto (non si sa mai ...) dopo aver aperto il file con successo e prima del tentativo, il file non verrà chiuso, quindi una soluzione più sicura è:

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

    # do stuff with f

finally:
    if f is not None:
       f.close()

Utilizzando un'istruzione with open (...), non importa come il blocco with è finito (anche con un'eccezione) il file è chiuso
darkgaze

@darkgaze with open(...)è sicuramente la scelta migliore nel moderno Python.
mljrg

11

Non è necessario chiudere il file secondo i documenti se si utilizza con:

È buona norma utilizzare la parola chiave with quando si tratta di oggetti file. Questo ha il vantaggio che il file viene chiuso correttamente al termine della sua suite, anche se viene sollevata un'eccezione durante il percorso. È anche molto più breve della scrittura di blocchi di prova alla fine equivalenti:

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

Maggiori informazioni qui: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Questo è sia corretto che ignaro della domanda.
Jon-Eric

-4

Ecco un esempio dato che quindi come usare opene "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()

È necessario quante volte hai aperto il file per chiuderlo.


1
Se viene sollevata un'eccezione dopo openma prima close, il file non verrà chiuso correttamente utilizzando questo approccio. L'utilizzo di witho try/ finallychiude il file correttamente anche in presenza di eccezioni.
Jon-Eric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.