web-dev-qa-db-fra.com

comment utiliser tempfile.NamedTemporaryFile () dans python

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

36
Manoj

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.

46
Dave Webb

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
37
Jay P.

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)
0
Hugues