web-dev-qa-db-fra.com

Générer des noms de fichiers temporaires sans créer de fichier dans Python

La question, numéro 10501247 , dans stackoverflow explique comment créer un 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 un 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')
...
68
Hill

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

import tempfile

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

Un nouvel appel de next renverra un autre nom, etc. Cela ne vous donnera pas le chemin du dossier temporaire. Pour obtenir le répertoire 'tmp' par défaut, utilisez:

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

Je pense que le moyen le plus simple et le plus sûr de procéder consiste à:

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

Un répertoire temporaire est créé auquel vous seul pouvez accéder. Il ne devrait donc y avoir aucun problème de sécurité, mais aucun fichier ne sera créé. Vous pouvez donc simplement choisir le nom de fichier que vous souhaitez créer dans ce répertoire.

29
Alec

C'est peut-être un peu tard, mais y a-t-il un problème avec cela?

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

tempfile.mktemp() faire ceci.

Mais notez que c'est obsolète. Cependant ne créera pas le fichier et il s’agit d’une fonction publique dans tempfile par rapport à l’utilisation de la fonction _get_candidate_names().

Il est déconseillé en raison de l’écart de temps entre l’appel et l’essai de création du fichier. Cependant, dans mon cas, les chances sont si minces et même si cela échouait, ce serait acceptable. Mais c'est à vous d'évaluer pour votre cas d'utilisation.

7
Zitrax

Comme Joachim Isaksson l’a dit dans ses commentaires, si vous n’obtenez qu’un nom, vous risquez d’avoir des problèmes si un autre programme utilise ce nom avant votre programme. Les chances sont minces, mais pas impossibles.

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

4
PM 2Ring

En combinant les réponses précédentes, ma solution est la suivante:

def get_tempfile_name(some_id):
    return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)

Faire some_id facultatif s'il n'est pas nécessaire pour vous.

4
juanmirocks