2014-10-24 11 views
38

La domanda, number 10501247, in StackOverflow fornisce una risposta su come creare un file temporaneo in Python.
Ho solo bisogno di avere un nome di file temporaneo nel mio caso.
La chiamata a tempfile.NamedTemporaryFile() restituisce l'handle del file dopo la creazione effettiva del file.
C'è modo di ottenere solo il nome del file?Generare nomi di file temporanei senza creare il file effettivo in Python

# Trying to get temp file path 
tf = tempfile.NamedTemporaryFile() 
temp_file_name = tf.name 
tf.close() 
# Here is my real purpose to get the temp_file_name 
f = gzip.open(temp_file_name ,'wb') 
... 
+4

'NamedTemporaryFile' garantisce un nome univoco, (probabilmente) provandolo e riprovando se esiste. Ottenere solo un nome non garantisce che puoi effettivamente creare il file in un secondo momento, ti stai aprendo alle condizioni di gara di qualcun altro che usa lo stesso nome prima di te. –

+2

@Joachim Vero, qui c'è una condizione di gara e sarebbe preferibile evitarlo. Tuttavia, a volte è necessario passare un nome di file temporaneo a una funzione (il file aperto si verifica internamente.) Avere un nome ben casuale dà una probabilità molto migliore che la condizione della competizione sia un non-problema. Penso che sia necessario fornire un buon nomefile temporaneo per minimizzare la possibilità di un errore della condizione di competizione. Naturalmente aggiungendo un buon prefisso e suffisso basato sul processo in esecuzione e l'attività che viene eseguita fornirà ancora meno possibilità di collisione. – PolyMesh

risposta

30

Se si desidera un nome di file temporaneo solo è possibile chiamare interiore funzione tempfile _get_candidate_names():

import tempfile 

temp_name = next(tempfile._get_candidate_names()) 
% e.g. px9cp65s 

Calling next ancora una volta, tornerà un altro nome, ecc Questo non ti dà il percorso di temperatura cartella. Per ottenere directory di default 'tmp', utilizzare:

defult_tmp_dir = tempfile._get_default_tempdir() 
% results in: /tmp 
+2

modo migliore per creare una directory temporanea è 'temp_dir = tempfile.mkdtemp (prefix = 'some-prefix _') 'che creerà in modo sicuro una directory temporanea e restituirà una stringa con il percorso assoluto. –

4

Come ha detto Joachim Isaksson nei commenti, se si ottiene un nome di voi potrebbero avere problemi se qualche altro programma succede ad usare quel nome prima che il programma fa. Le probabilità sono magre, ma non impossibili.

Quindi la cosa sicura da fare in questa situazione è utilizzare il costruttore completo GzipFile(), che ha la firma GzipFile([filename[, mode[, compresslevel[, fileobj]]]]). Quindi puoi passarlo anche con l'open fileobj e con un nome di file, se vuoi. Vedi i documenti di gzip per i dettagli.

10

Potrebbe essere un po 'tardi, ma c'è qualcosa di sbagliato in questo?

import tempfile 
with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile: 
    temp_file_name = tmpfile.name 
f = gzip.open(temp_file_name ,'wb') 
+11

Questo codice creerà effettivamente il file temporaneo per ottenere il suo nome, mentre nella domanda si dice 'senza creare il file reale in Python'. – jkukul

+0

Questo non risponde alla domanda – herve

6

tempfile.mktemp() fare questo.

Ma si noti che è deprecato. Tuttavia sarà non creare il file ed è una funzione pubblica in tempfile rispetto all'uso di _get_candidate_names().

Il motivo per cui è deprecato è dovuto al divario di tempo tra la chiamata a questo e in realtà il tentativo di creare il file. Comunque nel mio caso la possibilità è così sottile e anche se dovesse fallire sarebbe accettabile. Ma spetta a te valutare per il tuo caso.

+1

"anche se fallire sarebbe accettabile"; la condizione di gara non è solo un rischio di fallimento, è un rischio per la sicurezza (vedi la documentazione di 'tempfile.mktemp'). Quindi non dovrebbe essere considerato accettabile. – bignose

+2

@bignose È un * potenziale * problema di sicurezza. Dipende da cosa vuoi fare, dall'ambiente di esecuzione in cui ti trovi, ecc. Detto questo, potrebbe essere più sicuro fare qualcosa come "os.path.join" (tempfile.mkdtemp(), "qualcosa") "Lì almeno la directory è creata (e di tua proprietà, presumo). – Alec

7

penso che il modo più semplice, modo più sicuro per farlo è qualcosa di simile:

path = os.path.join(tempfile.mkdtemp(), 'something') 

una directory temporanea viene creata che solo si può accedere, quindi non ci dovrebbero essere problemi di sicurezza, ma non ci sarà file creati in esso, quindi puoi semplicemente scegliere qualsiasi nome di file che vuoi creare in quella directory.

Problemi correlati