Générer des noms de fichiers temporaires sans créer de fichier réel en Python

La question, numéro 10501247 , dans stackoverflow donne la réponse à la création de fichier temporaire en Python.
Je n’ai besoin que d’un nom de fichier temporaire dans mon cas.
L’appel de tempfile.NamedTemporaryFile () renvoie le descripteur de fichier après la création du fichier.
Est-il possible d’obtenir le nom de fichier uniquement?

# 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') ... 

Si vous voulez un nom de fichier temporaire, vous pouvez appeler la fonction tempfile interne _get_candidate_names() :

 import tempfile temp_name = next(tempfile._get_candidate_names()) % eg px9cp65s 

L’appel next nouveau, renverra un autre nom, etc. Cela ne vous donne pas le chemin d’access au dossier temp. Pour obtenir le répertoire ‘tmp’ par défaut, utilisez:

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

C’est peut-être un peu tard, mais y a-t-il quelque chose qui cloche?

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

Je pense que la manière la plus simple et la plus sûre de procéder est la suivante:

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

Un répertoire temporaire est créé que vous seul pouvez accéder, il ne doit donc y avoir aucun problème de sécurité, mais aucun fichier ne sera créé, vous pouvez donc choisir n’importe quel nom de fichier que vous souhaitez créer dans ce répertoire.

tempfile.mktemp() fait cela.

Mais notez que c’est déconseillé. Cependant, il ne créera pas le fichier et c’est une fonction publique dans tempfile par rapport à l’utilisation de _get_candidate_names() .

La raison pour laquelle il est obsolète est due à l’intervalle de temps entre l’appel de ce fichier et la tentative réelle de création du fichier. Cependant, dans mon cas, les chances sont minces et même si elles échouaient, cela serait acceptable. Mais c’est à vous d’évaluer pour votre compte d’utilisateur.

Comme l’a dit Joachim Isaksson dans les commentaires, si vous obtenez un nom, il se peut que vous renconsortingez des problèmes si un autre programme utilise ce nom avant votre programme. Les chances sont minces, mais pas impossibles.

Donc, la chose sûre à faire dans cette situation est d’utiliser le constructeur GzipFile () complet, qui a la signature GzipFile( [filename[, mode[, compresslevel[, fileobj]]]]) . Vous pouvez donc lui transmettre le fichier ouvert ainsi qu’un nom de fichier si vous le souhaitez. Voir les documents gzip pour plus de détails.