2011-10-21 10 views
6

Diciamo che apro un file, che non esisteva in precedenza, per la scrittura:Rimozione di un file con solo l'oggetto di file python

f = open('/tmp/test.txt', 'w') 

Una volta che questa linea viene eseguito il file '/ tmp/test. txt 'è stato creato. Qual è il modo più pulito per rimuovere (eliminare) il file solo con l'oggetto file (f) e non con il percorso?

risposta

19

Non è possibile rimuovere un handle di file, solo un percorso di file, poiché più percorsi possono refer to the same file e alcuni file (come socket) non hanno nemmeno percorsi. Pertanto:

import os 
f = open('/tmp/test.txt', 'w') 
os.unlink(f.name) 
# You can still use f here, it's just only visible for people having a handle. 
# close it when you're finished. 

Tuttavia, non si dovrebbe fare che - c'è un modo migliore per risolvere il problema. Usa il modulo tempfile che cancella il file automaticamente, o scrivi semplicemente su /dev/null se hai solo bisogno di un handle di file e non ti interessa del contenuto che stai scrivendo.

+2

+1 - Sospetto che Tempfile sia davvero ciò di cui ha bisogno l'interrogante. –

4

È possibile ottenere il nome del file da parte del membro name ed eliminare come al solito:

In [1]: f = open('/tmp/test.txt', 'w') 

In [2]: f.name 
Out[2]: '/tmp/test.txt' 
2

risposta completa:

f = open('/tmp/test.txt', 'w') 
f.close() 

os.remove(f.name) 

è necessario chiudere il file prima di cancellare (documentazione dice che getta un'eccezione sotto Windows se il file è aperto - non ha controllato questo). f nel tuo caso è solo una maniglia. Non è un file stesso, quindi non è possibile eliminarlo direttamente.

0

A seconda delle esigenze, è possibile anche allontanarsi senza creare un file. Se tutto ciò di cui hai bisogno è un oggetto simile a un file, la maggior parte delle volte puoi usare un'istanza di io.StringIO al posto di un file. Questo può essere utile per prevenire operazioni di I/O non necessarie.

>>> from io import StringIO 
>>> f=StringIO() 
>>> f.write(u'Hello, world!') 
13 
>>> f.seek(0) 
0 
>>> f.read() 
u'Hello, world!' 
>>> f.close() 
Problemi correlati