tempfile.md
1> **Источник:** https://python-all.ru/3.14/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `tempfile` – Создание временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.14/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. [`TemporaryFile`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile), [`NamedTemporaryFile`](https://python-all.ru/3.14/library/tempfile.html#tempfile.NamedTemporaryFile), [`TemporaryDirectory`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryDirectory) и [`SpooledTemporaryFile`](https://python-all.ru/3.14/library/tempfile.html#tempfile.SpooledTemporaryFile) – это высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут использоваться как [менеджеры контекста](https://python-all.ru/3.14/glossary.html#term-context-manager). [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkdtemp) – низкоуровневые функции, требующие ручной очистки.1415Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов и каталогов. Имена файлов, используемые этим модулем, содержат строку случайных символов, что позволяет безопасно создавать эти файлы в общих временных каталогах. Для сохранения обратной совместимости порядок аргументов несколько необычен; для ясности рекомендуется использовать именованные аргументы.1617Модуль определяет следующие вызываемые пользователем элементы:1819#### `tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`2021Возвращает [файлоподобный объект](https://python-all.ru/3.14/glossary.html#term-file-like-object), который можно использовать как временное хранилище. Файл создаётся безопасно по тем же правилам, что и [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо вообще не создаётся, либо удаляется сразу после создания файла. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, имеет ли временный файл, созданный с помощью этой функции, видимое имя в файловой системе или нет.2223Полученный объект можно использовать как [менеджер контекста](https://python-all.ru/3.14/glossary.html#term-context-manager) (см. [Примеры](https://python-all.ru/3.14/library/tempfile.html#tempfile-examples)). После завершения контекста или уничтожения файлового объекта временный файл будет удалён из файловой системы.2425Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы обеспечить единообразное поведение на всех платформах независимо от хранящихся данных. Параметры *buffering*, *encoding*, *errors* и *newline* интерпретируются так же, как для [`open()`](https://python-all.ru/3.14/library/functions.html#open).2627Параметры *dir*, *prefix* и *suffix* имеют тот же смысл и значения по умолчанию, что и в [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp).2829Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут `file` которого является базовым настоящим файловым объектом.3031Флаг [`os.O_TMPFILE`](https://python-all.ru/3.14/library/os.html#os.O_TMPFILE) используется, если он доступен и работает (только для Linux, требуется ядро Linux версии 3.11 или новее).3233На платформах, которые не являются ни POSIX, ни Cygwin, TemporaryFile является псевдонимом для NamedTemporaryFile.3435Вызывает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.3637Изменено в версии 3.5: Теперь флаг [`os.O_TMPFILE`](https://python-all.ru/3.14/library/os.html#os.O_TMPFILE) используется, если доступен.3839Изменено в версии 3.8: Добавлен параметр *errors*.4041#### `tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None, delete_on_close=True)`4243Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile), за следующими исключениями:4445- Эта функция возвращает файл, который гарантированно имеет видимое имя в файловой системе.46- Для управления именованным файлом она расширяет параметры [`TemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile) параметрами *delete* и *delete\_on\_close*, которые определяют, должен ли именованный файл автоматически удаляться и как именно.4748Возвращаемый объект всегда является [файлоподобным объектом](https://python-all.ru/3.14/glossary.html#term-file-like-object), чей атрибут `file` является базовым настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.14/reference/compound_stmts.html#with), как обычный файл. Имя временного файла можно получить из атрибута `name` возвращаемого файлоподобного объекта. В Unix, в отличие от [`TemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile), запись каталога не удаляется сразу после создания файла.4950Если *delete* равен true (по умолчанию) и *delete\_on\_close* равен true (по умолчанию), файл удаляется сразу после закрытия. Если *delete* равен true и *delete\_on\_close* равен false, файл удаляется только при выходе из менеджера контекста или при финализации [файлоподобного объекта](https://python-all.ru/3.14/glossary.html#term-file-like-object). Удаление не всегда гарантируется в этом случае (см. [`object.__del__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__del__)). Если *delete* равен false, значение *delete\_on\_close* игнорируется.5152Поэтому, чтобы использовать имя временного файла для повторного открытия после закрытия, либо убедитесь, что файл не удаляется при закрытии (установите параметр *delete* в false), либо, если временный файл создаётся в операторе [`with`](https://python-all.ru/3.14/reference/compound_stmts.html#with), установите параметр *delete\_on\_close* в false. Рекомендуется второй подход, поскольку он обеспечивает автоматическую очистку временного файла при выходе из менеджера контекста.5354Повторное открытие временного файла по его имени, пока он ещё открыт, работает следующим образом:5556- В POSIX файл всегда можно открыть повторно.57- В Windows убедитесь, что выполняется хотя бы одно из следующих условий:5859 - *delete* равен false60 - дополнительное открытие разделяет доступ на удаление (например, вызов [`os.open()`](https://python-all.ru/3.14/library/os.html#os.open) с флагом `O_TEMPORARY`)61 - *delete* равен true, а *delete\_on\_close* равен false. Обратите внимание, что в этом случае дополнительные открытия, которые не разделяют доступ на удаление (например, созданные через встроенный [`open()`](https://python-all.ru/3.14/library/functions.html#open)), должны быть закрыты до выхода из менеджера контекста, иначе вызов [`os.unlink()`](https://python-all.ru/3.14/library/os.html#os.unlink) при выходе из менеджера контекста завершится ошибкой [`PermissionError`](https://python-all.ru/3.14/library/exceptions.html#PermissionError).6263В Windows, если *delete\_on\_close* равен false, и файл создаётся в каталоге, для которого у пользователя нет прав на удаление, то вызов [`os.unlink()`](https://python-all.ru/3.14/library/os.html#os.unlink) при выходе из менеджера контекста завершится ошибкой [`PermissionError`](https://python-all.ru/3.14/library/exceptions.html#PermissionError). Этого не может произойти, когда *delete\_on\_close* равен true, потому что право на удаление запрашивается при открытии, и оно сразу завершится ошибкой, если запрошенное право не предоставлено.6465Только в POSIX процесс, который был внезапно завершён с помощью SIGKILL, не может автоматически удалить созданные им NamedTemporaryFiles.6667Вызывает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.6869Изменено в версии 3.8: Добавлен параметр *errors*.7071Изменено в версии 3.12: Добавлен параметр *delete\_on\_close*.7273#### `class tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`7475Этот класс работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что data накапливаются в памяти, пока размер файла не превысит *max\_size*, или пока не будет вызван метод [`fileno()`](https://python-all.ru/3.14/library/io.html#io.IOBase.fileno) файла; после этого содержимое записывается на диск и работа продолжается как с `TemporaryFile()`.7677#### `rollover()`7879У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.8081Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` является либо объектом [`io.BytesIO`](https://python-all.ru/3.14/library/io.html#io.BytesIO), либо [`io.TextIOWrapper`](https://python-all.ru/3.14/library/io.html#io.TextIOWrapper) (в зависимости от того, был ли указан бинарный или текстовый *режим*), либо настоящим файловым объектом, в зависимости от того, вызывался ли [`rollover()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.SpooledTemporaryFile.rollover). Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.14/reference/compound_stmts.html#with), как и обычный файл.8283Изменено в версии 3.3: метод truncate теперь принимает аргумент *size*.8485Изменено в версии 3.8: Добавлен параметр *errors*.8687Изменено в версии 3.11: Полностью реализует абстрактные базовые классы [`io.BufferedIOBase`](https://python-all.ru/3.14/library/io.html#io.BufferedIOBase) и [`io.TextIOBase`](https://python-all.ru/3.14/library/io.html#io.TextIOBase) (в зависимости от того, был ли указан бинарный или текстовый *режим*).8889#### `class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True)`9091Этот класс безопасно создаёт временный каталог, используя те же правила, что и [`mkdtemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkdtemp). Полученный объект может использоваться как [менеджер контекста](https://python-all.ru/3.14/glossary.html#term-context-manager) (см. [Примеры](https://python-all.ru/3.14/library/tempfile.html#tempfile-examples)). По завершении контекста или уничтожении объекта временного каталога вновь созданный временный каталог и всё его содержимое удаляются из файловой системы.9293#### `name`9495Имя каталога можно получить из атрибута `name` возвращённого объекта. Когда возвращённый объект используется как [менеджер контекста](https://python-all.ru/3.14/glossary.html#term-context-manager), значение `name` будет присвоено цели предложения `as` в операторе [`with`](https://python-all.ru/3.14/reference/compound_stmts.html#with), если оно есть.9697#### `cleanup()`9899Каталог можно явно очистить, вызвав метод `cleanup()`. Если *ignore\_cleanup\_errors* равно true, любые необработанные исключения во время явной или неявной очистки (например, [`PermissionError`](https://python-all.ru/3.14/library/exceptions.html#PermissionError) удаление открытых файлов в Windows) будут игнорироваться, а остальные удаляемые элементы будут удалены по принципу «насколько возможно». В противном случае ошибки будут возбуждаться в том контексте, где происходит очистка (вызов `cleanup()`, выход из менеджера контекста, когда объект удаляется сборщиком мусора или во время завершения интерпретатора).100101Параметр *delete* можно использовать для отключения очистки дерева каталогов при выходе из контекста. Хотя может показаться необычным, что менеджер контекста отключает действие при выходе из контекста, это может быть полезно во время отладки или когда нужно, чтобы поведение очистки было условным в зависимости от другой логики.102103Вызывает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.104105Добавлено в версии 3.2.106107Изменено в версии 3.10: Добавлен параметр *ignore\_cleanup\_errors*.108109Изменено в версии 3.12: Добавлен параметр *delete*.110111#### `tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)`112113Создаёт временный файл максимально безопасным способом. В создании файла нет состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.14/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.14/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания, является ли файл исполняемым, файл не может быть исполнен никем.114115Файловый дескриптор [не наследуется дочерними процессами](https://python-all.ru/3.14/library/os.html#fd-inheritance).116117В отличие от [`TemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.TemporaryFile), пользователь `mkstemp()` отвечает за удаление временного файла после завершения работы с ним.118119Если *suffix* не равен `None`, имя файла будет заканчиваться на этот суффикс, иначе суффикса не будет. `mkstemp()` не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.120121Если *prefix* не равен `None`, имя файла будет начинаться с этого префикса; иначе используется префикс по умолчанию. По умолчанию берётся возвращаемое значение [`gettempprefix()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempprefix) или [`gettempprefixb()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempprefixb), в зависимости от ситуации.122123Если *dir* не равен `None`, файл будет создан в этом каталоге; иначе используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Поэтому нет гарантии, что сгенерированное имя файла будет обладать какими-либо полезными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.124125Если любой из *suffix*, *prefix* и *dir* не равен `None`, они должны быть одного типа. Если они являются bytes, возвращаемое имя будет bytes, а не str. Если нужно принудительно получить bytes при остальных значениях по умолчанию, передайте `suffix=b''`.126127Если *text* указан и равен true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в бинарном режиме.128129`mkstemp()` возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/3.14/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.130131Вызывает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.132133Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.134135Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.14/glossary.html#term-path-like-object).136137#### `tempfile.mkdtemp(suffix=None, prefix=None, dir=None)`138139Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.140141Пользователь `mkdtemp()` отвечает за удаление временного каталога и его содержимого после использования.142143Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp).144145`mkdtemp()` возвращает абсолютный путь к новому каталогу.146147Вызывает [событие аудита](https://python-all.ru/3.14/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.148149Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.150151Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.14/glossary.html#term-path-like-object).152153Изменено в версии 3.12: `mkdtemp()` теперь всегда возвращает абсолютный путь, даже если *dir* задан относительным.154155#### `tempfile.gettempdir()`156157Возвращает имя каталога, используемого для временных файлов. Оно определяет значение по умолчанию для аргумента *dir* во всех функциях этого модуля.158159Python просматривает стандартный список каталогов, чтобы найти тот, в котором вызывающий пользователь может создавать файлы. Список:1601611. Каталог, заданный переменной окружения `TMPDIR`.1622. Каталог, заданный переменной окружения `TEMP`.1633. Каталог, заданный переменной окружения `TMP`.1644. Расположение, зависящее от платформы:165166 - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.167 - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1685. В крайнем случае – текущий рабочий каталог.169170Результат этого поиска кэшируется; см. описание [`tempdir`](https://python-all.ru/3.14/library/tempfile.html#tempfile.tempdir) ниже.171172Изменено в версии 3.10: Теперь всегда возвращает str. Ранее возвращал любое значение [`tempdir`](https://python-all.ru/3.14/library/tempfile.html#tempfile.tempdir) независимо от типа, если оно не было `None`.173174#### `tempfile.gettempdirb()`175176То же, что [`gettempdir()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempdir), но возвращаемое значение в байтах.177178Добавлено в версии 3.5.179180#### `tempfile.gettempprefix()`181182Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.183184#### `tempfile.gettempprefixb()`185186То же, что [`gettempprefix()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempprefix), но возвращаемое значение в байтах.187188Добавлено в версии 3.5.189190Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, который возвращается [`gettempdir()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempdir). Её можно задать напрямую, чтобы переопределить процесс выбора, но это не рекомендуется. Все функции этого модуля принимают аргумент *dir*, который можно использовать для указания каталога. Это рекомендуемый подход, так как он не удивляет другой код, не ожидающий изменения глобального поведения API.191192#### `tempfile.tempdir`193194Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* функций, определённых в этом модуле, включая его тип (bytes или str). Она не может быть [path-like object](https://python-all.ru/3.14/glossary.html#term-path-like-object).195196Если `tempdir` равно `None` (значение по умолчанию) при любом вызове любой из перечисленных выше функций, кроме [`gettempprefix()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempprefix), она инициализируется по алгоритму, описанному в [`gettempdir()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.gettempdir).197198> **Примечание**199>200> Имейте в виду: если присвоить `tempdir` значение типа bytes, возникает неприятный побочный эффект: глобальный возвращаемый тип по умолчанию для [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkdtemp) меняется на bytes, если не указаны явные аргументы `prefix`, `suffix` или `dir` типа str. Пожалуйста, не пишите код, который рассчитывает или полагается на это. Это неудобное поведение сохраняется для совместимости с исторической реализацией.201202## Примеры203204Вот несколько примеров типичного использования модуля `tempfile`:205206```python207>>> import tempfile208209# create a temporary file and write some data to it210>>> fp = tempfile.TemporaryFile()211>>> fp.write(b'Hello world!')212# read data from file213>>> fp.seek(0)214>>> fp.read()215b'Hello world!'216# close the file, it will be removed217>>> fp.close()218219# create a temporary file using a context manager220>>> with tempfile.TemporaryFile() as fp:221... fp.write(b'Hello world!')222... fp.seek(0)223... fp.read()224b'Hello world!'225>>>226# file is now closed and removed227228# create a temporary file using a context manager229# close the file, use the name to open the file again230>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:231... fp.write(b'Hello world!')232... fp.close()233... # файл закрыт, но не удалён234... # открыть файл снова по его имени235... with open(fp.name, mode='rb') as f:236... f.read()237b'Hello world!'238>>>239# file is now removed240241# create a temporary directory using the context manager242>>> with tempfile.TemporaryDirectory() as tmpdirname:243... print('created temporary directory', tmpdirname)244>>>245# directory and contents have been removed246```247248## Устаревшие функции и переменные249250Раньше для создания временных файлов сначала генерировали имя с помощью функции [`mktemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mktemp), а затем создавали файл с этим именем. К сожалению, это небезопасно, так как другой процесс может создать файл с таким именем в промежутке между вызовом `mktemp()` и последующей попыткой первого процесса создать файл. Решение – объединить два шага и создавать файл сразу. Этот подход используется в [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp) и других описанных выше функциях.251252#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`253254Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp) вместо.255256Возвращает абсолютное имя пути к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* аналогичны аргументам [`mkstemp()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.mkstemp), за исключением того, что имена файлов в байтах, `suffix=None` и `prefix=None` не поддерживаются.257258> **Предупреждение**259>260> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование `mktemp()` можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.14/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:261>262> ```python263> >>> f = NamedTemporaryFile(delete=False)264> >>> f.name265> '/tmp/tmptjujjt'266> >>> f.write(b"Hello World!\n")267> 13268> >>> f.close()269> >>> os.unlink(f.name)270> >>> os.path.exists(f.name)271> False272> ```273