> **Источник:** https://python-all.ru/3.0/library/tempfile.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `tempfile` – Генерация временных файлов и каталогов

Этот модуль генерирует временные файлы и каталоги. Он работает на всех поддерживаемых платформах. В нем появились три новые функции: [`NamedTemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile), [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp), которые должны полностью устранить необходимость в небезопасной функции [`mktemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mktemp). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.

Кроме того, все вызываемые пользователем функции теперь принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов. Больше нет необходимости использовать глобальные переменные *tempdir* и *template*. Для сохранения обратной совместимости порядок аргументов несколько необычен; рекомендуется использовать именованные аргументы для ясности.

Модуль определяет следующие функции, которые могут вызываться пользователем:

#### `[tempfile.TemporaryFile]tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])`

Возвращает объект, похожий на файл, который можно использовать в качестве временного хранилища. Файл создаётся с помощью [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). Под Unix запись о файле в каталоге удаляется сразу после создания файла. Другие платформы этого не поддерживают; код не должен полагаться на то, что временный файл, созданный этой функцией, имеет или не имеет видимого имени в файловой системе.

Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он вёл себя одинаково на всех платформах независимо от хранимых данных. *bufsize* по умолчанию равен `-1`, то есть используется значение по умолчанию операционной системы.

Параметры *dir*, *prefix* и *suffix* передаются в [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).

Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это объект, подобный файлу, атрибут `file` которого является базовым настоящим файловым объектом. Этот объект, подобный файлу, можно использовать в операторе [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with), как обычный файл.

#### `[tempfile.NamedTemporaryFile]tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])`

Эта функция работает точно так же, как

[`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile)

, за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута

`name`

объекта файла. Возможность использовать это имя для повторного открытия файла, пока временный файл ещё открыт, зависит от платформы (в Unix это возможно, в Windows NT и новее – нет). Если

*delete*

равно true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, атрибут

`file`

которого представляет собой настоящий файловый объект. Этот файлоподобный объект можно использовать в инструкции

[`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with)

, как обычный файл.

#### `[tempfile.SpooledTemporaryFile]tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])`

Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные сохраняются в памяти, пока размер файла не превысит *max\_size* или пока не будет вызван метод `fileno()` файла; после этого содержимое записывается на диск, и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile).

Полученный файл имеет один дополнительный метод, `rollover()`, который вызывает переход файла на дисковый файл независимо от его размера.

Возвращаемый объект является файлоподобным объектом, атрибут `_file` которого может быть либо объектом `StringIO`, либо настоящим файловым объектом, в зависимости от того, была ли вызвана `rollover()`. Этот файлоподобный объект можно использовать в инструкции [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with), как обычный файл.

#### `[tempfile.mkstemp]tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])`

Создает временный файл максимально безопасным способом. При создании файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.0/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.0/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю (UID). Если платформа использует биты разрешений для указания исполняемости файла, файл неисполним никем. Файловый дескриптор не наследуется дочерними процессами.

В отличие от [`TemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.

Если указан *suffix*, имя файла будет заканчиваться этим суффиксом, в противном случае суффикса не будет. [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.

Если указан *prefix*, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.

Если указан *dir*, файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, задав переменные окружения *TMPDIR*, *TEMP* или *TMP*. Таким образом, нет гарантии, что сгенерированное имя файла будет обладать какими-либо удобными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.

Если указан параметр *text*, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.

[`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как бы вернул [`os.open()`](https://python-all.ru/3.0/library/os.html#os.open)) и абсолютный путь к этому файлу, в указанном порядке.

#### `[tempfile.mkdtemp]tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])`

Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.

Пользователь [`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после завершения работы.

Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).

[`mkdtemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.

#### `[tempfile.mktemp]tempfile.mktemp([suffix=''[, prefix='tmp'[, dir=None]]])`

Устарело с версии 2.3: Вместо этого используйте [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).

Возвращает абсолютный путь к файлу, которого не существовало на момент вызова. Аргументы *prefix*, *suffix* и *dir* такие же, как у [`mkstemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mkstemp).

> **Предупреждение**
>
> Использование этой функции может привести к появлению уязвимости в вашей программе. К тому моменту, как вы соберетесь что-то делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.0/library/tempfile.html#tempfile.NamedTemporaryFile), передав ей параметр `delete=False`:
>
> ```python
> >>> f = NamedTemporaryFile(delete=False)
> >>> f
> <open file '<fdopen>', mode 'w+b' at 0x384698>
> >>> f.name
> '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'
> >>> f.write("Hello World!\n")
> >>> f.close()
> >>> os.unlink(f.name)
> >>> os.path.exists(f.name)
> False
> ```

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

#### `[tempfile.tempdir]tempfile.tempdir`

Если этой переменной присвоено значение, отличное от `None`, она определяет значение по умолчанию для аргумента *dir* всех функций, определённых в этом модуле.

Если `tempdir` не задан или равен `None` при любом вызове любой из перечисленных выше функций, Python просматривает стандартный список каталогов и устанавливает *tempdir* равным первому каталогу, в котором вызвавший пользователь может создавать файлы. Список:

1. Каталог, указанный переменной окружения **TMPDIR**.
2. Каталог, указанный переменной окружения **TEMP**.
3. Каталог, указанный переменной окружения **TMP**.
4. Расположение, зависящее от платформы:

   - На Windows каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP`, в указанном порядке.
   - На всех остальных платформах каталоги `/tmp`, `/var/tmp` и `/usr/tmp`, в указанном порядке.
5. В крайнем случае – текущий рабочий каталог.

#### `[tempfile.gettempdir]tempfile.gettempdir()`

Возвращает каталог, выбранный в данный момент для создания временных файлов. Если

[`tempdir`](https://python-all.ru/3.0/library/tempfile.html#tempfile.tempdir)

не равно

`None`

, эта функция просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.

#### `[tempfile.gettempprefix]tempfile.gettempprefix()`

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