La question, numéro 10501247 , dans stackoverflow donne la réponse 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 réelle du fichier.
Existe-t-il un moyen d'obtenir uniquement le nom du fichier?
# 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')
...
python
temporary-files
Colline
la source
la source
NamedTemporaryFile
garantit un nom unique, (probablement) en l'essayant et en réessayant s'il existe. Obtenir juste un nom ne garantira pas que vous pourrez créer le fichier plus tard, vous vous ouvrez à la condition de concurrence de quelqu'un d'autre utilisant le même nom avant vous.Réponses:
Si vous voulez uniquement un nom de fichier temporaire, vous pouvez appeler la fonction de fichier temporaire interne
_get_candidate_names()
:Appeler à
next
nouveau, renverra un autre nom, etc. Cela ne vous donne pas le chemin du dossier temporaire. Pour obtenir le répertoire 'tmp' par défaut, utilisez:la source
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
créer en toute sécurité un répertoire temporaire et de renvoyer une chaîne avec le chemin absolu.next(tempfile._get_candidate_names())
ne renvoie pas nécessairement un chemin inexistant, c'est pourquoi les interfaces de fichier temporaire au niveau de l'utilisateur peuvent essayer plusieurs noms jusqu'à ce qu'un nom inutilisé soit trouvé :tempfile.gettempdir()
au lieu de privétempfile._get_default_tempdir()
.tempfile.mkdtemp
l'utilisation que l'utilisateur est responsable de la suppression du répertoire temporaire et de son contenu une fois terminé.Je pense que le moyen le plus simple et le plus sûr de le faire est quelque chose comme:
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.
edit: Dans Python 3, vous pouvez maintenant utiliser
tempfile.TemporaryDirectory()
comme gestionnaire de contexte pour gérer la suppression à votre place:la source
tempfile.mkdtemp
l'utilisation que l'utilisateur est responsable de la suppression du répertoire temporaire et de son contenu une fois terminé.tempfile.TemporaryDirectory()
comme gestionnaire de contexte, il sera supprimé pour vous.Il est peut-être un peu tard, mais y a-t-il quelque chose de mal à cela?
la source
without creating actual file in Python
.tempfile.mktemp()
fais ça.Mais notez qu'il est obsolète. Cependant, il ne créera pas le fichier et il s'agit d'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 et la tentative de création du fichier. Cependant, dans mon cas, les chances que cela se produise sont si minces et même si cela échouait, ce serait acceptable. Mais c'est à vous d'évaluer votre cas d'utilisation.
la source
tempfile.mktemp
documentation). Cela ne devrait donc pas être considéré comme acceptable.os.path.join(tempfile.mkdtemp(), 'something')
Là au moins le répertoire est créé (et vous appartient, je suppose).En combinant les réponses précédentes, ma solution est:
Rendre
some_id
facultatif s'il n'est pas nécessaire pour vous.la source
_get_candidate_names()
n'existe pas, on peut utiliser par défaut un générateur de chaînes semi-aléatoire. Par exemple, certains uuid.Comme Joachim Isaksson l'a dit dans les commentaires, si vous n'obtenez qu'un nom, vous pouvez avoir 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 complet GzipFile (), qui a la signature
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Vous pouvez donc lui transmettre le fichier obj ouvert, ainsi qu'un nom de fichier, si vous le souhaitez. Consultez la documentation gzip pour plus de détails.la source