La chiusura di un file dopo averlo aperto con `open ()` è richiesta in Python? [chiuso]


9

Per quanto riguarda la mia domanda precedente , ho notato che in entrambe le risposte che utilizzavano la open()funzione non si faceva menzione della chiusura del file.

Ho letto che è buona pratica farlo, ma ce n'è davvero bisogno? È solo un codice non necessario?

Il file viene chiuso automaticamente?


1
with open (file_name, ...) as variable:invoca automaticamente il close()metodo non appena si esce da questo blocco di codice.
Byte Commander


@ByteCommander vuoi dare il tuo commento come risposta, per rendere questa domanda "risolta"?
TellMePerché il

1
In python3, il file viene confuso automaticamente quando non ha più riferimenti.
Jacob Vlijm,

4
Sto votando per chiudere questa domanda come fuori tema perché si tratta di una domanda generale su Python senza alcun collegamento con gli script su Ubuntu. sta chiedendo le migliori pratiche in un linguaggio di programmazione.
terdon,

Risposte:


9

Quando vengono chiusi i file?

Come possiamo imparare da È esplicitamente importante chiudere i file? (StackOverflow) , l'interprete Python chiude il file nei seguenti casi:

  • invochi manualmente il close()metodo di un fileoggetto in modo esplicito o implicito lasciando un with open(...):blocco. Funziona ovviamente sempre e su qualsiasi implementazione di Python.
  • l' fileultimo riferimento dell'oggetto è stato rimosso e quindi l'oggetto viene elaborato dal Garbage Collector. Questa non è una funzione del linguaggio, ma una funzione speciale dell'implementazione di CPython, quindi per la portabilità non fare affidamento su questo!
  • l'interprete Python termina. In questo caso dovrebbe chiudere tutti gli handle di file che sono stati aperti. Alcune versioni precedenti di Python3 avrebbero anche stampato un avvertimento che dovresti averle chiuse manualmente. Tuttavia, immagina un arresto anomalo o uccidi forzatamente l'interprete Python e vedrai che anche questo non è affidabile.

Quindi solo il primo metodo (manuale) è affidabile!

Cosa succederebbe se un file rimane aperto?

Innanzitutto, a seconda dell'implementazione dell'interprete Python, se hai aperto un file con accesso in scrittura, non puoi essere sicuro che le tue modifiche siano state scaricate sul disco fino a quando non lo induci manualmente o il gestore di file non viene chiuso.

In secondo luogo, è possibile aprire solo un numero limitato di file sul sistema per utente. Se si supera questo limite, ad esempio aprendo molti file in un ciclo nel programma Python senza chiuderli il prima possibile, il sistema potrebbe rifiutarsi di aprire ulteriori handle di file per l'utente e si riceverà un'eccezione. Può anche succedere che il tuo programma prenda l'ultimo file aperto consentito e che un altro programma fallisca perché viene rifiutato.

In terzo luogo, i file aperti su un dispositivo rimovibile impediscono che venga smontato o espulso. È ancora possibile eliminare il file su alcuni file system come ext4, in cui semplicemente il descrittore di file / hard link all'inode del file viene rimosso / scollegato ma il programma che ha aperto il file può ancora accedere all'inode tramite il proprio gestore di file temporaneo. Questo è ad esempio anche il meccanismo che consente di aggiornare i pacchetti mentre il rispettivo software è in esecuzione. Tuttavia, ad esempio NTFS non ha questa caratteristica. Tuttavia, potrebbe non essere mai modificato da due processi simultanei, quindi sarà comunque in qualche modo bloccato per altri.


Non del tutto vero per python3 !!
Jacob Vlijm,

@JacobVlijm Ti dispiacerebbe spiegarlo?
Byte Commander

Vedi il commento sotto la domanda. La risposta su "non buone pratiche" nel link della tua risposta è del 2011. Se è mai esistita, l'avviso in python3non esiste più e la risposta è obsoleta. La garbage collection automatica esiste per un motivo e funziona perfettamente. Sono passati anni da quando ho usato close()specificamente. Mai e poi mai riscontrato un singolo errore causato dal non utilizzo.
Jacob Vlijm,

Soo ... Sai se le altre implementazioni come PyPy, Jython o IronPython chiudono i file nello stesso modo di CPython? E se avessi ucciso l'interprete, non avrebbe avuto la possibilità di chiudere il file, giusto? E penso anche che il limite di file aperto sia ancora valido. Che dire di scaricare i dati scritti? Sai qualcosa di più aggiornato lì?
Byte Commander

1
@JacobVlijm Grazie per il suggerimento. : P La mia macchina si è già bloccata durante la creazione di quel file ... Non avevo nemmeno bisogno di Python per quello.
Byte Commander
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.