2015-05-21 14 views
11

Quando si apre un file, questo viene archiviato in un oggetto file aperto che consente di accedere a vari metodi su di esso come la lettura o la scrittura.Cosa posso fare con un oggetto file chiuso?

>>> f = open("file0") 
>>> f 
<open file 'file0', mode 'r' at 0x0000000002E51660> 

Ovviamente quando hai finito devi chiudere il file per evitare che occupi spazio di memoria.

>>> f.close() 
>>> f 
<closed file 'file0', mode 'r' at 0x0000000002E51660> 

Questo lascia un file chiuso, in modo che l'oggetto esiste ancora se non è più sta usando lo spazio per il gusto di essere leggibile. Ma c'è qualche applicazione pratica di questo? Non può essere letto o scritto. Non può essere utilizzato per riaprire il file nuovamente.

>>> f.open() 

Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    f.open() 
AttributeError: 'file' object has no attribute 'open' 

>>> open(f) 

Traceback (most recent call last): 
    File "<pyshell#10>", line 1, in <module> 
    open(f) 
TypeError: coercing to Unicode: need string or buffer, file found 

C'è un uso pratico per questo oggetto file chiuso a parte l'identificazione che un oggetto file viene fatto riferimento, ma è chiuso?

+3

Inoltre, qual è l'alternativa? Un oggetto non può cancellarsi o modificare i riferimenti a se stesso, quindi un file chiuso è essenzialmente l'unica opzione. –

+0

@Lattyware Non mi sono reso conto che un oggetto non può cancellarsi, sebbene abbia senso come pratica. – SuperBiasedMan

+2

Puoi controllare se il file è stato "veramente" chiuso da f.closed –

risposta

16

Un uso è utilizzando il nome di riaprire il file:

open(f.name).read() 

io uso l'attributo name quando si cambia un contenuto file utilizzando un NamedTemporaryFile di scrivere il contenuto aggiornato per poi sostituire il file originale con shutil.move :

with open("foo.txt") as f, NamedTemporaryFile("w",dir=".", delete=False) as temp: 
    for line in f: 
     if stuff 
     temp.write("stuff") 

shutil.move(temp.name,"foo.txt") 

anche come commentato è possibile utilizzare il f.closed per vedere se il file è davvero chiuso.

Problemi correlati