tempfile.md
1> **Источник:** https://python-all.ru/3.9/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`tempfile`](https://python-all.ru/3.9/library/tempfile.html#module-tempfile) – Создание временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.9/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. [`TemporaryFile`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryFile), [`NamedTemporaryFile`](https://python-all.ru/3.9/library/tempfile.html#tempfile.NamedTemporaryFile), [`TemporaryDirectory`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryDirectory) и [`SpooledTemporaryFile`](https://python-all.ru/3.9/library/tempfile.html#tempfile.SpooledTemporaryFile) – высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут использоваться как менеджеры контекста. [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.9/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.9/glossary.html#term-file-like-object), который можно использовать как временное хранилище. Файл создаётся безопасно по тем же правилам, что и [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо вообще не создаётся, либо удаляется сразу после создания файла. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, имеет ли временный файл, созданный с помощью этой функции, видимое имя в файловой системе или нет.2223Полученный объект можно использовать как менеджер контекста (см. [Примеры](https://python-all.ru/3.9/library/tempfile.html#tempfile-examples)). После завершения работы контекста или уничтожения файлового объекта временный файл будет удалён из файловой системы.2425Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы обеспечить единообразное поведение на всех платформах независимо от хранящихся данных. Параметры *buffering*, *encoding*, *errors* и *newline* интерпретируются так же, как для [`open()`](https://python-all.ru/3.9/library/functions.html#open).2627Параметры *dir*, *prefix* и *suffix* имеют тот же смысл и значения по умолчанию, что и в [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp).2829Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут `file` которого является базовым настоящим файловым объектом.3031Флаг [`os.O_TMPFILE`](https://python-all.ru/3.9/library/os.html#os.O_TMPFILE) используется, если он доступен и работает (только для Linux, требуется ядро Linux версии 3.11 или новее).3233На платформах, которые не являются ни POSIX, ни Cygwin, TemporaryFile является псевдонимом для NamedTemporaryFile.3435Вызывает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.3637Изменено в версии 3.5: Теперь флаг [`os.O_TMPFILE`](https://python-all.ru/3.9/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)`4243Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута `name` возвращаемого файлоподобного объекта. Возможность повторно открыть файл по этому имени, пока временный файл с именем ещё открыт, зависит от платформы (в Unix это возможно, в Windows – нет). Если *delete* равно True (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, чей атрибут `file` является лежащим в основе настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.9/reference/compound_stmts.html#with), как обычный файл.4445Вызывает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.4647Изменено в версии 3.8: Добавлен параметр *errors*.4849#### `tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)`5051Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные буферизируются в памяти, пока размер файла не превысит *max\_size*, или пока не будет вызван метод `fileno()`, после чего содержимое записывается на диск и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryFile).5253У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.5455Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` является либо объектом [`io.BytesIO`](https://python-all.ru/3.9/library/io.html#io.BytesIO), либо [`io.TextIOWrapper`](https://python-all.ru/3.9/library/io.html#io.TextIOWrapper) (в зависимости от того, был ли указан бинарный или текстовый *режим*), либо настоящим файловым объектом, в зависимости от того, вызывался ли `rollover()`. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.9/reference/compound_stmts.html#with), как и обычный файл.5657Изменено в версии 3.3: метод truncate теперь принимает аргумент `size`.5859Изменено в версии 3.8: Добавлен параметр *errors*.6061#### `tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)`6263Эта функция безопасно создаёт временный каталог по тем же правилам, что и [`mkdtemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkdtemp). Полученный объект можно использовать как контекстный менеджер (см. [Примеры](https://python-all.ru/3.9/library/tempfile.html#tempfile-examples)). По завершении контекста или уничтожении объекта временного каталога, созданный временный каталог и всё его содержимое удаляются из файловой системы.6465Имя каталога можно получить из атрибута `name` возвращаемого объекта. Если возвращаемый объект используется как менеджер контекста, то `name` будет присвоен цели предложения `as` в инструкции [`with`](https://python-all.ru/3.9/reference/compound_stmts.html#with), если она есть.6667Каталог можно явно очистить, вызвав метод `cleanup()`.6869Вызывает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.7071Новое в версии 3.2.7273#### `tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)`7475Создаёт временный файл наиболее безопасным способом. В процессе создания файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.9/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.9/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания на исполняемость файла, то файл не является исполняемым никем. Файловый дескриптор не наследуется дочерними процессами.7677В отличие от [`TemporaryFile()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.7879Если *suffix* не равен `None`, имя файла будет заканчиваться на этот суффикс, иначе суффикса не будет. [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.8081Если *prefix* не равен `None`, имя файла будет начинаться с этого префикса; иначе используется префикс по умолчанию. По умолчанию берётся возвращаемое значение [`gettempprefix()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempprefix) или [`gettempprefixb()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempprefixb), в зависимости от ситуации.8283Если *dir* не равен `None`, файл будет создан в этом каталоге; иначе используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Поэтому нет гарантии, что сгенерированное имя файла будет обладать какими-либо полезными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.8485Если любой из *suffix*, *prefix* и *dir* не равен `None`, они должны быть одного типа. Если они являются bytes, возвращаемое имя будет bytes, а не str. Если нужно принудительно получить bytes при остальных значениях по умолчанию, передайте `suffix=b''`.8687Если *text* указан и равен true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в бинарном режиме.8889[`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/3.9/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.9091Вызывает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `tempfile.mkstemp` с аргументом `fullpath`.9293Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.9495Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.9/glossary.html#term-path-like-object).9697#### `tempfile.mkdtemp(suffix=None, prefix=None, dir=None)`9899Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.100101Пользователь [`mkdtemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после использования.102103Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp).104105[`mkdtemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.106107Вызывает [событие аудита](https://python-all.ru/3.9/library/sys.html#auditing) `tempfile.mkdtemp` с аргументом `fullpath`.108109Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.110111Изменено в версии 3.6: Параметр *dir* теперь принимает [path-like object](https://python-all.ru/3.9/glossary.html#term-path-like-object).112113#### `tempfile.gettempdir()`114115Возвращает имя каталога, используемого для временных файлов. Оно определяет значение по умолчанию для аргумента *dir* во всех функциях этого модуля.116117Python просматривает стандартный список каталогов, чтобы найти тот, в котором вызывающий пользователь может создавать файлы. Список:1181191. Каталог, заданный переменной окружения `TMPDIR`.1202. Каталог, заданный переменной окружения `TEMP`.1213. Каталог, заданный переменной окружения `TMP`.1224. Расположение, зависящее от платформы:123124 - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.125 - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1265. В крайнем случае – текущий рабочий каталог.127128Результат этого поиска кэшируется; см. описание [`tempdir`](https://python-all.ru/3.9/library/tempfile.html#tempfile.tempdir) ниже.129130#### `tempfile.gettempdirb()`131132То же, что [`gettempdir()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempdir), но возвращаемое значение в байтах.133134Новое в версии 3.5.135136#### `tempfile.gettempprefix()`137138Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.139140#### `tempfile.gettempprefixb()`141142То же, что [`gettempprefix()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempprefix), но возвращаемое значение в байтах.143144Новое в версии 3.5.145146Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращаемых функцией [`gettempdir()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempdir). Её можно установить напрямую, чтобы переопределить процесс выбора, но этого делать не рекомендуется. Все функции в этом модуле принимают аргумент *dir*, который можно использовать для указания каталога, и это рекомендуемый подход.147148#### `tempfile.tempdir`149150Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* функций, определённых в этом модуле.151152Если `tempdir` равно `None` (значение по умолчанию) при любом вызове любой из перечисленных выше функций, кроме [`gettempprefix()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempprefix), она инициализируется по алгоритму, описанному в [`gettempdir()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.gettempdir).153154## Примеры155156Вот несколько примеров типичного использования модуля [`tempfile`](https://python-all.ru/3.9/library/tempfile.html#module-tempfile):157158```python159>>> import tempfile160161# create a temporary file and write some data to it162>>> fp = tempfile.TemporaryFile()163>>> fp.write(b'Hello world!')164# read data from file165>>> fp.seek(0)166>>> fp.read()167b'Hello world!'168# close the file, it will be removed169>>> fp.close()170171# create a temporary file using a context manager172>>> with tempfile.TemporaryFile() as fp:173... fp.write(b'Hello world!')174... fp.seek(0)175... fp.read()176b'Hello world!'177>>>178# file is now closed and removed179180# create a temporary directory using the context manager181>>> with tempfile.TemporaryDirectory() as tmpdirname:182... print('created temporary directory', tmpdirname)183>>>184# directory and contents have been removed185```186187## Устаревшие функции и переменные188189Раньше для создания временных файлов сначала генерировали имя с помощью функции [`mktemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mktemp), а затем создавали файл с этим именем. К сожалению, это небезопасно, так как другой процесс может создать файл с таким именем в промежутке между вызовом [`mktemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mktemp) и последующей попыткой первого процесса создать файл. Решение – объединить два шага и создавать файл сразу. Этот подход используется в [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) и других описанных выше функциях.190191#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`192193Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp) вместо.194195Возвращает абсолютное имя пути к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* аналогичны аргументам [`mkstemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mkstemp), за исключением того, что имена файлов в байтах, `suffix=None` и `prefix=None` не поддерживаются.196197> **Предупреждение**198>199> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.9/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:200>201> ```python202> >>> f = NamedTemporaryFile(delete=False)203> >>> f.name204> '/tmp/tmptjujjt'205> >>> f.write(b"Hello World!\n")206> 13207> >>> f.close()208> >>> os.unlink(f.name)209> >>> os.path.exists(f.name)210> False211> ```212