Подтвердить что ты не робот

Как использовать tempfile.NamedTemporaryFile() в python

Я хочу использовать tempfile.NamedTemporaryFile() для записи в него некоторого содержимого, а затем открыть этот файл. Я написал следующий код:

tf = tempfile.NamedTemporaryFile()
tfName = tf.name
tf.seek(0)
tf.write(contents)
tf.flush()

но я не могу открыть этот файл и посмотреть его содержимое в блокноте или аналогичном приложении. Есть ли способ достичь этого? Почему я не могу сделать что-то вроде:

os.system('start notepad.exe ' + tfName)

в конце

4b9b3361

Ответ 1

Это может быть одной из двух причин:

Во-первых, по умолчанию временный файл удаляется, как только он закрывается. Чтобы исправить это использование:

tf = tempfile.NamedTemporaryFile(delete=False)

а затем удалите файл вручную, как только вы его просмотрите в другом приложении.

В качестве альтернативы, возможно, потому, что файл все еще открыт в Python. Windows не позволит вам открыть его с помощью другого приложения.

Ответ 2

Вы также можете использовать его с менеджером контекста, чтобы файл был закрыт/удален, когда он выходит из области видимости. Он также будет очищен, если код в менеджере контекста повысится.

import tempfile
with tempfile.NamedTemporaryFile() as temp:
    temp.write('Some data')
    temp.flush()

    # do something interesting with temp before it is destroyed

Ответ 3

Вот полезный контекстный менеджер для этого. (По моему мнению, эта функциональность должна быть частью стандартной библиотеки 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)