Je veux utiliser tempfile.NamedTemporaryFile()
pour y écrire du contenu, puis ouvrir ce fichier. J'ai écrit le code suivant:
tf = tempfile.NamedTemporaryFile()
tfName = tf.name
tf.seek(0)
tf.write(contents)
tf.flush()
mais je ne peux pas ouvrir ce fichier et voir son contenu dans le bloc-notes ou une application similaire. Y'a-t-il une quelconque façon de réussir cela? Pourquoi je ne peux pas faire quelque chose comme:
os.system('start notepad.exe ' + tfName)
à la fin
Cela pourrait être l'une des deux raisons:
Tout d'abord, par défaut, le fichier temporaire est supprimé dès sa fermeture . Pour corriger cette utilisation:
tf = tempfile.NamedTemporaryFile(delete=False)
puis supprimez le fichier manuellement une fois que vous avez fini de le visualiser dans l'autre application.
Alternativement, cela pourrait être dû au fait que le fichier est toujours ouvert dans Python Windows ne vous permettra pas de l'ouvrir à l'aide d'une autre application.
Vous pouvez également l'utiliser avec un gestionnaire de contexte afin que le fichier soit fermé/supprimé lorsqu'il sort de la portée. Il sera également nettoyé si le code du gestionnaire de contexte augmente.
import tempfile
with tempfile.NamedTemporaryFile() as temp:
temp.write('Some data')
temp.flush()
# do something interesting with temp before it is destroyed
Voici un gestionnaire de contexte utile pour cela. (À mon avis, cette fonctionnalité devrait faire partie de la bibliothèque standard Python.)
# python2 or python3
import contextlib
import os
@contextlib.contextmanager
def temporary_filename(suffix=None):
"""Context that introduces a temporary file.
Creates a temporary file, yields its name, and upon context exit, deletes it.
(In contrast, tempfile.NamedTemporaryFile() provides a 'file' object and
deletes the file as soon as that file object is closed, so the temporary file
cannot be safely re-opened by another library or process.)
Args:
suffix: desired filename extension (e.g. '.mp4').
Yields:
The name of the temporary file.
"""
import tempfile
try:
f = tempfile.NamedTemporaryFile(suffix=suffix, delete=False)
tmp_name = f.name
f.close()
yield tmp_name
finally:
os.unlink(tmp_name)
# Example:
with temporary_filename() as filename:
os.system('echo Hello >' + filename)
assert 6 <= os.path.getsize(filename) <= 8 # depending on text EOL
assert not os.path.exists(filename)