2013-06-15 21 views
27

Ho un file temporaneo con alcuni contenuti e uno script python che genera un output in questo file. Voglio ripetere N volte, quindi ho bisogno di riutilizzare quel file (in realtà array di file). Sto cancellando l'intero contenuto, quindi il file temporaneo sarà vuoto nel ciclo successivo. Per l'eliminazione di contenuti che uso questo codice:Come eliminare solo il contenuto del file in python

def deleteContent(pfile): 

    pfile.seek(0) 
    pfile.truncate() 
    pfile.seek(0) # I believe this seek is redundant 

    return pfile 

tempFile=deleteContent(tempFile) 

La mia domanda è: C'è un altro (meglio, più corto o più sicuro) modo per cancellare l'intero contenuto senza in realtà l'eliminazione del file temporaneo dal disco?

Qualcosa come tempFile.truncateAll()?

+1

Il secondo tentativo è effettivamente ridondante. Perché non creare solo un ** nuovo ** file temporaneo? –

+0

Perché per uno script comune, avrò bisogno di circa 400 file temporanei invece di ~ 10. Quindi penso che sia meglio riciclarli. Ho sbagliato? – bartimar

+0

Hai incontrato problemi reali? Vorrei solo creare nuovi file temporanei e lasciare che Python e il sistema operativo ripuliscano quelli che ho chiuso. –

risposta

58

come eliminare solo il contenuto dei file in python

Ci sono diversi modi di impostare la dimensione logica di un file a 0, a seconda di come si accede quel file:

Per svuotare un file aperto:

def deleteContent(pfile): 
    pfile.seek(0) 
    pfile.truncate() 

Per svuotare un file aperto il cui descrittore di file è noto:

def deleteContent(fd): 
    os.ftruncate(fd, 0) 
    os.lseek(fd, 0, os.SEEK_SET) 

Per svuotare un file chiuso (il cui nome è noto)

def deleteContent(fName): 
    with open(fName, "w"): 
     pass 



Ho un file temporaneo con alcuni contenuti [ ...] Ho bisogno di riutilizzare t file di

Detto questo, nel caso generale cappello probabilmente non è efficace né auspicabile riutilizzo un file temporaneo. A meno che non si hanno esigenze molto specifiche, si dovrebbe pensare di utilizzare tempfile.TemporaryFile e un manager contesto per creare quasi trasparente/uso/cancellare i file temporanei:

import tempfile 

with tempfile.TemporaryFile() as temp: 
    # do whatever you want with `temp` 

# <- `tempfile` guarantees the file being both closed *and* deleted 
#  on exit of the context manager 
+0

'pfile.truncate (0)' non resetterà il puntatore del file, quindi sarà necessario eseguire 'pfile.seek (0)' in entrambi i casi. Lo stesso vale per 'os.ftruncate()'. FWIW, puoi ottenere il descrittore di file da 'pfile.fileno()', quindi 'os.ftruncate (pfile.fileno(), 0)' funzionerebbe, ma avresti ancora bisogno di fare il 'pfile.seek (0) 'dopo. – Aya

+2

Da http://docs.python.org/2/library/stdtypes.html#file.truncate 'Si noti che se una dimensione specificata supera la dimensione corrente del file, il risultato dipende dalla piattaforma: le possibilità includono che il file possa rimanere invariato, aumentare alla dimensione specificata come se riempito a zero o aumentare alla dimensione specificata con nuovo contenuto non definito. "Ecco perché non l'ho fatto. – bartimar

+0

In effetti stavo guardando quel documento adesso. Capisco che il puntatore del file possa rimanere nella sua posizione se è ancora valido (es .: puntando prima della nuova fine logica del file). Ma cosa stiamo troncando il file prima della posizione corrente? Quindi ho fatto il test. Su Linux, 'truncate (0)' non sposta la posizione corrente come riportato da 'ftell()' - ma la scrittura successiva viene effettuata all'inizio del file come previsto. –

2

Cosa potrebbe essere più facile che qualcosa di simile:

import tempfile 

for i in range(400): 
    with tempfile.TemporaryFile() as tf: 
     for j in range(1000): 
      tf.write('Line {} of file {}'.format(j,i)) 

Questo crea 400 file temporanei e scrive 1000 righe per ogni file temporaneo. Esegue in meno di 1/2 secondo sulla mia macchina insignificante. Ogni file temporaneo del totale viene creato ed eliminato mentre il gestore di contesto si apre e si chiude in questo caso. È veloce, sicuro e multipiattaforma.

Utilizzare tempfile è molto meglio che provare a reinventarlo.

+1

Penso che 'seek (0)' e 'truncate()' senza ciclo sia effettivamente più semplice, migliore, (forse più veloce) e più bello a OS/python :) Avevo paura che qualcuno venisse catturato nel riutilizzo/riciclaggio ... Comunque la mia domanda è la stessa, quindi questa non è la risposta. – bartimar

+2

Hai provato quell'ipotesi? L'hai programmato per vedere? – dawg

2

Si può fare questo:

def deleteContent(pfile): 
    fn=pfile.name 
    pfile.close() 
    return open(fn,'w') 
2

penso che il più semplice è quello di aprire semplicemente il file in modalità di scrittura e quindi chiuderlo. Ad esempio, se il file contiene myfile.dat:

"This is the original content" 

allora si può semplicemente scrivere:

f = open('myfile.dat', 'w') 
f.close() 

Questo sarebbe cancellare tutto il contenuto. Quindi puoi scrivere il nuovo contenuto nel file:

f = open('myfile.dat', 'w') 
f.write('This is the new content!') 
f.close() 
Problemi correlati