Сообщить об ошибке.

Функция NamedTemporaryFile() модуля tempfile в Python

Временный файл имеющий имя

Синтаксис:

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. Последний подход рекомендуемый, т.к. он обеспечивает автоматическую очистку временного файла при выходе из контекстного менеджера.

Повторное открытие временного файла по его имени, пока он все еще открыт, работает следующим образом:

  • В POSIX файл всегда можно открыть снова.
  • В Windows должно быть выполнено хотя бы одно из следующих условий:
    • Аргумент 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())