2012-06-15 8 views
21

Sto lavorando a uno script Python che deve creare circa 50 distinti file temporanei, che vengono tutti aggiunti di frequente durante il corso dello script e uniti alla fine. Sono sicuro che il modulo tempfile può fare ciò di cui ho bisogno, ma non sono stato in grado di capire come leggere la documentazione.Come usare Python's tempfile.NamedTemporaryFile()?

Desidero utilizzare i file temporanei, al contrario delle variabili, per risparmiare memoria di sistema, poiché questi blocchi di dati diventano grandi mentre lo script elabora decine di migliaia di altri file.

Il seguente pezzo di codice è la mod Attualmente sto usando per creare questi file (untemporarily) in una directory untemporary:

item = (string from another file) # string must id file for future use 
tmpfile = 'tmpfiles/' + item 
if item not in totalitems: 
    totalitems.add(item) 
    with open(tmpfile, 'w') as itemfile: 
     output = some stuff 
     tmpfile.write(output) 
else: 
    with open(tmpfile, 'a') as itemfile: 
     output = different stuff 
     tmpfile.write(output) 

Penso che quello che ho bisogno è tempfile.NamedTemporaryFile(). Secondo il documentation:

Questo nome può essere recuperato da parte del membro nome dell'oggetto file.

Purtroppo, non capisco cosa significhi. Devo solo essere in grado di richiamare ogni file più tardi quando corro di nuovo il suo "elemento" corrispondente nei file che sto elaborando. Presumo che questo sia piuttosto semplice e io sto solo diventando denso. Nel caso abbia importanza, ho versioni di questo script sia per Python 2.7.1 che per 3.2.3. Ho davvero bisogno solo dell'uno o dell'altro per lavorare; Ho creato sia come esercizio di apprendimento.

+0

possibile duplicato di [modo migliore per generare i nomi di file casuali in Python] (http://stackoverflow.com/questions/10501247/best-way- to-generate-random-file-names-in-python) – Joe

+1

@Joe, Parte di questa domanda sembra essere un duplicato del thread che hai collegato. Parte di ciò non è; vedi il commento sotto la risposta di Levon sotto. – Gregory

+0

Perché hai bisogno che questi file siano nominati? Se sono senza nome (pre-eliminati), c'è meno da sbagliare in termini di pulizia. Puoi semplicemente memorizzare l'oggetto tmpfile, non il suo nome, e quindi chiamare 'seek (0)' per andare all'inizio per essere pronto a leggere ... o mmap il suo contenuto, o comunque accedervi come preferisci. –

risposta

34

"Questo nome può essere recuperato dal membro del nome dell'oggetto file."

significa che è possibile ottenere il nome del file temporaneo creato in questo modo:

In [4]: import tempfile 

In [5]: tf = tempfile.NamedTemporaryFile() 
In [6]: tf.name # retrieve the name of the temp file just created 
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i' 

Nota: per impostazione predefinita verrà cancellato il file quando è chiuso. Tuttavia, se il parametro delete è False, il file non viene eliminato automaticamente. Vedere lo Python docs su questo per ulteriori informazioni.

Poiché è possibile recuperare il nome di ciascuno dei 50 file temporanei che si desidera creare, è possibile salvarli, ad es. In un elenco, prima di riutilizzarli in un secondo momento (come dici tu). Assicurati di impostare il valore delete di conseguenza in modo che i file non scompaiano quando li chiudi (nel caso in cui pianifichi di chiudere e poi riaprili in seguito).

ho spiegato come creare i nomi dei file temporanei in modo più dettagliato qui Best way to generate random file names in Python

+0

Grazie per il collegamento al thread con la tua risposta originale. Non sono ancora sicuro di come digitare il file sul valore di qualche variabile "elemento". Ho colpito l'idea di usare un dizionario per questo; sembra appropriato seguire la riga 5 del tuo codice sopra? 'Item_tmpfile = {item: tf.name}'. Quindi potrei in seguito chiamare 'item_tmpfile [item]'. – Gregory

+0

@pyrogerg Sì, penso che dovrebbe funzionare, dovresti associare il nome di ogni file temporaneo con un diverso 'item' dove' item' sarebbe la chiave per recuperare il nome temporaneo del file in seguito. Presumo che il tuo dizionario avrebbe alla fine 50 voci, giusto? Hai intenzione di chiudere i file tra usi? in tal caso, fai attenzione al parametro 'delete'. – Levon

+0

Grazie per il suggerimento 'delete'; L'ho capito nella tua risposta originale. Penso di essere sulla strada giusta ora. Suppongo di poter usare questi file come qualsiasi altro nel corso dello script, ad es. 'con open (item_tmpfiles [elemento]) come tf:'? – Gregory