2013-08-01 7 views

risposta

9

No, ma si può semplicemente adattarlo per chiudere il file:

# file not yet opened 
with open(fileName, 'r') as f: 
    # file opened 
    c = pickle.load(f) 
    # file opened 
# file closed 

Cosa L'istruzione with, è (tra le altre cose) chiamando il metodo __exit__() dell'oggetto elencato nell'istruzione with (in questo caso: file aperto), che in questo caso chiude il fi le.

Per quanto riguarda il metodo di file aperto __exit__():

>>> f = open('deleteme.txt', 'w') 
>>> help(f.__exit__) 
Help on built-in function __exit__: 

__exit__(...) 
    __exit__(*excinfo) -> None. Closes the file. 
+0

Grazie Tadeck! –

2

Sì, il valore restituito di open ha una durata pari a quella della chiamata a pickle.load. Chiude il descrittore di file aperto quando viene chiuso.

Se sei paranoico, prendere in considerazione:

with open(fileName,'r') as fin: 
    c = pickle.load(fin) 

Il with parola chiave stabilisce la durata del fin

+0

Sei sicuro della durata del gestore di file? Potresti postare un link per favore? – inspectorG4dget

+1

Python è garbage collection. L'oggetto viene pulito e chiude il suo FD quindi. Provalo e guarda in/proc i descrittori di file aperti. –

+0

Ciao Eric, grazie per aver condiviso! Lo apprezzo molto. Tuttavia, quando ho provato a cercare il file aperto in python, non è chiuso ... Ma non ho mai saputo controllare prima di vedere il tuo post. Potrebbe essere solo la mia distribuzione python però ... Grazie ancora! –

0

No, non chiude il file. Questo è un luogo in cui è possibile utilizzare il with dell'operatore:

with open('path/to/file') as infile: 
    c = pickle.load(f) 

Ulteriore lettura: this e this

3

Odio spaccare il capello, ma la risposta è sia sì o no - a seconda esattamente quello che stai chiedendo.

La riga, come scritto, chiude il descrittore di file? Sì.

Accadrà automaticamente dopo questa operazione? Sì ... ma probabilmente non immediatamente.

Il file verrà chiuso immediatamente dopo questa riga? No, non probabile (vedi risposta sopra).

Python elimina il descrittore di file quando il conteggio di riferimento per l'oggetto file è pari a zero. Se si sta aprendo il file in un ambito locale, ad esempio all'interno di una funzione (o come si è fatto, o anche se lo si è assegnato a una variabile locale all'interno di uno def), quando tale ambito locale viene ripulito - e se non ci sono riferimenti rimanenti all'oggetto file, il file verrà chiuso.

È, tuttavia, una scelta molto migliore per essere esplicito e aprire il file all'interno di un blocco with - che chiuderà il file per te anziché attendere che il garbage collector esegua il kick in.

Si deve anche fare attenzione nel caso in cui si assegna involontariamente il descrittore di file a una variabile locale ... (vedi: opened file descriptors in python) ma non lo si sta facendo. Controlla anche le risposte qui (vedi: check what files are open in Python) per alcuni modi in cui puoi verificare quali sono i descrittori di file aperti, con varianti diverse per qualsiasi sistema operativo in cui ti trovi.