Как использовать 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)
в конце
Ответы
Ответ 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)