import tempfile tempfile.NamedTemporaryFile(mode='w+b', buffering=None, \ encoding=None, newline=None, \ suffix=None, prefix=None, dir=None, \ delete=True, *, errors=None, delete_on_close=True)
mode='w+b'
- режим открытия файла,buffering=None
- буферизация,encoding=None
- кодировка для текстового режима,newline=None
- символ новой строки для текстового режима,suffix=None
- суффикс имени временного файла,prefix=None
- префикс имени временного файла,dir=None
- директория для создания файла,delete=True
- удалять файл после его закрытия,errors=None
- (добавлен в Python 3.8) обработчик ошибок кодировки для текстового режима,delete_on_close=True
- (добавлен в Python 3.12) удалять файл только при выходе из контекстного менеджера.Изменено в Python 3.8: Добавлен аргумент
errors
.Изменено в Python 3.12: Добавлен аргумент
delete_on_close
.
Функция NamedTemporaryFile()
модуля tempfile
работает точно так же, как и tempfile.TemporaryFile()
, за исключением следующих отличий:
tempfile.NamedTemporaryFile()
возвращает файл, который гарантированно имеет видимое имя в файловой системе.tempfile.TemporaryFile()
аргументами delete
и delete_on_close
(добавлен в Python 3.12), которые определяют, должен ли и каким образом указанный файл автоматически удаляться.Возвращаемый объект всегда является файлоподобным объектом, атрибут file
которого является базовым истинным файловым объектом. Этот "файлоподобный объект" можно использовать в операторе with
, как обычный файл. Имя временного файла можно получить из атрибута file.name
возвращаемого файлового объекта. В Unix, в отличие от tempfile.TemporaryFile()
, запись каталога не отключается сразу после создания файла.
Если оба аргумента delete
и delete_on_close
установлены в True
(по умолчанию), то файл удаляется, как только он закрывается. Если delete=True
, а delete_on_close=False
, то файл удаляется только при выходе из контекстного менеджера или же при финализации файлового объекта file_obj.__del__()
. В этом случае удаление не всегда гарантируется. Если delete=False
, то значение аргумента delete_on_close
игнорируется.
Чтобы использовать имя временного файла для повторного открытия файла после его закрытия, нужно не удалять его при закрытии (delete=False
), либо, в случае использования оператора with
, установите для параметра delete_on_close=False
. Последний подход рекомендуемый, т.к. он обеспечивает автоматическую очистку временного файла при выходе из контекстного менеджера.
Повторное открытие временного файла по его имени, пока он все еще открыт, работает следующим образом:
delete
должен быть False
.os.open()
с флагом O_TEMPORARY
).delete=True
то аргумент delete_on_close=False
. Обратите внимание, что в этом случае дополнительные открытия, которые не имеют общего доступа к удалению (например, созданные с помощью встроенной функции open()
), должны быть закрыты перед выходом из диспетчера контекста, иначе вызов os.unlink()
при выходе из диспетчера контекста завершится с ошибкой PermissionError
.В Windows, если delete_on_close
имеет значение False
и файл создан в каталоге, для которого у пользователя нет доступа к удалению, то вызов os.unlink()
при выходе из диспетчера контекста завершится с ошибкой PermissionError
. Этого не может произойти, если delete_on_close
имеет значение True
, поскольку доступ на удаление запрашивается открытием, которое немедленно завершается неудачно, если запрошенный доступ не предоставлен.
Только в POSIX процесс, который внезапно завершается с помощью SIGKILL
, не может автоматически удалить любые созданные им NamedTemporaryFiles
.
Вызывает событие аудита tempfile.mkstemp
с аргументом fullpath
.
Есть ситуации, когда важно иметь именованный временный файл. Для приложений, охватывающих несколько процессов или даже хостов, присвоение имени файлу является самым простым способом передачи его между частями приложения. Функция tempfile.NamedTemporaryFile()
создает файл, не отменяя его связь, поэтому он сохраняет свое имя, доступ к которому осуществляется с помощью атрибута name
.
import tempfile >>> fp = tempfile.NamedTemporaryFile(mode='w+t', \ suffix='_suffix', prefix='prefix_', dir='/tmp' delete=False) # у временного файла есть имя >>> fp.name # '/tmp/prefix_d3ti3oz_suffix' >>> fp.write('Привет docs-python.ru!') # пока временный файл не закрыт, его можно # открыть для чтения и записи по его имени >>> tmp = open(tmp_file_name) # закрываем первое обращение к файлу >>> fp.close() # к временному файлу все # еще можно обратится >>> tmp.read() # 'Привет docs-python.ru!' >>> tmp.close()
with
Временный файл автоматически удаляется, когда заканчивается блок with
import tempfile # Создаем именованный временный файл with tempfile.NamedTemporaryFile() as fp: print('Имя файла', fp.name) # Пишем во временный файл fp.write(b"Hello, World!") fp.seek(0) # Читаем, что записали print(fp.read())