93 votes

Comment puis-je créer un fichier tmp en Python ?

J'ai cette fonction qui fait référence au chemin d'un fichier :

some_obj.file_name(chemin_du_fichier)

où chemin_du_fichier est une chaîne de caractères du chemin d'un fichier, c'est-à-dire H:/chemin/NOM_DU_FICHIER.ext

Je veux créer un fichier NOM_DU_FICHIER.ext à l'intérieur de mon script python avec le contenu d'une chaîne de caractères :

some_string = 'c'est un contenu quelconque'

Comment procéder? Le script Python sera placé à l'intérieur d'une boîte Linux.

0 votes

Ouvrez avec 'w' et fermez-le, utilisez os.touch(fname).

0 votes

Pourquoi avez-vous besoin du fichier temporaire alors?

0 votes

J'ai une fonction qui appelle le FILE_PATH de l'objet donc il doit être là

173voto

Minras Points 1403

Je pense que vous cherchez un tempfile.NamedTemporaryFile.

import tempfile
with tempfile.NamedTemporaryFile() as tmp:
    print(tmp.name)
    tmp.write(...)

Mais :

Que le nom puisse être utilisé pour ouvrir le fichier une deuxième fois, alors que le fichier temporaire nommé est encore ouvert, varie selon les plateformes (il peut être utilisé sur Unix ; ce n'est pas possible sur Windows NT ou ultérieur).

Si cela vous préoccupe :

import os, tempfile
tmp = tempfile.NamedTemporaryFile(delete=False)
try:
    print(tmp.name)
    tmp.write(...)
finally:
    tmp.close()
    os.unlink(tmp.name)

9 votes

C'est une bonne réponse basée sur le sujet de la question, que Google note, plutôt que sur le problème particulier de SuperString

3 votes

Et vous pouvez passer un argument facultatif dir=chemin à NamedTemporaryFile si vous voulez contrôler dans quel répertoire il l'alloue.

0 votes

Est-ce que vous devez utiliser os.unlink(tmp.name)? N'est-ce pas le but d'utiliser tempfile pour gérer le nettoyage?

106voto

Constantinius Points 13708

Il existe un module tempfile pour python, mais la création d'un simple fichier fait aussi l'affaire :

new_file = open("chemin/vers/NOM_FICHIER.ext", "w")

Vous pouvez maintenant y écrire en utilisant la méthode write :

new_file.write('c'est du contenu')

Avec le module tempfile, cela pourrait ressembler à ceci :

import tempfile

new_file, nom_fichier = tempfile.mkstemp()

print(nom_fichier)

os.write(new_file, "c'est du contenu")
os.close(new_file)

Avec mkstemp, vous êtes responsable de supprimer le fichier une fois que vous en avez terminé. Avec d'autres arguments, vous pouvez influencer le répertoire et le nom du fichier.


MISE À JOUR

Comme l'a justement souligné Emmet Speer, il y a des considérations de sécurité lors de l'utilisation de mkstemp, car le code client est responsable de la fermeture / du nettoyage du fichier créé. Une meilleure façon de le gérer est l'extrait suivant (tel que repris du lien) :

import os
import tempfile

fd, chemin = tempfile.mkstemp()
try:
    with os.fdopen(fd, 'w') as tmp:
        # faire des choses avec le fichier temporaire
        tmp.write('des choses')
finally:
    os.remove(chemin)

Le os.fdopen enveloppe le descripteur de fichier dans un objet fichier Python, qui se ferme automatiquement lorsque le with se termine. L'appel à os.remove supprime le fichier quand il n'est plus nécessaire.

-1voto

cakraww Points 311

Depuis Python 3.12, il y a une manière appropriée d'écrire dans un fichier temporaire, puis de le lire (extrait de https://docs.python.org/3.12/library/tempfile.html#examples):

with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
    fp.write(b'Hello world!')
    fp.close()

    # le fichier est fermé, mais pas supprimé
    # ouvrez à nouveau le fichier en utilisant son nom
    with open(fp.name, mode='rb') as f:
        f.read()

# le fichier est maintenant supprimé car il sort du `with`

Si vous souhaitez créer un fichier texte au lieu d'un fichier binaire, utilisez tempfile.NamedTemporaryFile(mode='w+t', delete_on_close=False) à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X