tempfile.md
1> **Источник:** https://python-all.ru/3.5/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.6. [`tempfile`](https://python-all.ru/3.5/library/tempfile.html#module-tempfile) – Создание временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/3.5/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. [`TemporaryFile`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryFile), [`NamedTemporaryFile`](https://python-all.ru/3.5/library/tempfile.html#tempfile.NamedTemporaryFile), [`TemporaryDirectory`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryDirectory) и [`SpooledTemporaryFile`](https://python-all.ru/3.5/library/tempfile.html#tempfile.SpooledTemporaryFile) – высокоуровневые интерфейсы, которые обеспечивают автоматическую очистку и могут использоваться как менеджеры контекста. [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkdtemp) – низкоуровневые функции, требующие ручной очистки.1415Все вызываемые пользователем функции и конструкторы принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов и каталогов. Имена файлов, используемые этим модулем, содержат строку случайных символов, что позволяет безопасно создавать эти файлы в общих временных каталогах. Для сохранения обратной совместимости порядок аргументов несколько необычен; для ясности рекомендуется использовать именованные аргументы.1617Модуль определяет следующие вызываемые пользователем элементы:1819#### `tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)`2021Возвращает [файлоподобный объект](https://python-all.ru/3.5/glossary.html#term-file-like-object), который можно использовать как временное хранилище. Файл создаётся безопасно по тем же правилам, что и [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо вообще не создаётся, либо удаляется сразу после создания файла. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, имеет ли временный файл, созданный с помощью этой функции, видимое имя в файловой системе или нет.2223Полученный объект можно использовать как менеджер контекста (см. [Примеры](https://python-all.ru/3.5/library/tempfile.html#tempfile-examples)). После завершения работы контекста или уничтожения файлового объекта временный файл будет удалён из файловой системы.2425Параметр *mode* по умолчанию равен `'w+b'`, поэтому созданный файл можно читать и записывать без закрытия. Двоичный режим используется для единообразного поведения на всех платформах независимо от хранимых данных. Параметры *buffering*, *encoding* и *newline* интерпретируются так же, как в [`open()`](https://python-all.ru/3.5/library/functions.html#open).2627Параметры *dir*, *prefix* и *suffix* имеют тот же смысл и значения по умолчанию, что и в [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp).2829Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут `file` которого является базовым настоящим файловым объектом.3031Флаг [`os.O_TMPFILE`](https://python-all.ru/3.5/library/os.html#os.O_TMPFILE) используется, если он доступен и работает (только для Linux, требуется ядро Linux версии 3.11 или новее).3233Изменено в версии 3.5: Теперь флаг [`os.O_TMPFILE`](https://python-all.ru/3.5/library/os.html#os.O_TMPFILE) используется, если доступен.3435#### `tempfile.NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)`3637Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута `name` возвращаемого файлоподобного объекта. Возможность использовать это имя для повторного открытия файла, пока именованный временный файл ещё открыт, зависит от платформы (в Unix это возможно; в Windows NT и новее – нет). Если *delete* равен true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, чей `file` атрибут является базовым настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), как обычный файл.3839#### `tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)`4041Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные буферизируются в памяти, пока размер файла не превысит *max\_size*, или пока не будет вызван метод `fileno()`, после чего содержимое записывается на диск и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryFile).4243У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.4445Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` – это либо объект [`io.BytesIO`](https://python-all.ru/3.5/library/io.html#io.BytesIO), либо [`io.StringIO`](https://python-all.ru/3.5/library/io.html#io.StringIO) (в зависимости от того, был ли указан двоичный или текстовый *mode*) или настоящий файловый объект, в зависимости от того, была ли вызвана функция `rollover()`. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), как обычный файл.4647Изменено в версии 3.3: метод truncate теперь принимает аргумент `size`.4849#### `tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)`5051Эта функция безопасно создаёт временный каталог по тем же правилам, что и [`mkdtemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkdtemp). Полученный объект можно использовать как контекстный менеджер (см. [Примеры](https://python-all.ru/3.5/library/tempfile.html#tempfile-examples)). По завершении контекста или уничтожении объекта временного каталога, созданный временный каталог и всё его содержимое удаляются из файловой системы.5253Имя каталога можно получить из атрибута `name` возвращаемого объекта. Если возвращаемый объект используется как менеджер контекста, то `name` будет присвоен цели предложения [`as`](https://python-all.ru/3.5/reference/compound_stmts.html#as) в инструкции [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with), если она есть.5455Каталог можно явно очистить, вызвав метод `cleanup()`.5657Новое в версии 3.2.5859#### `tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)`6061Создаёт временный файл наиболее безопасным способом. В процессе создания файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/3.5/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/3.5/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания на исполняемость файла, то файл не является исполняемым никем. Файловый дескриптор не наследуется дочерними процессами.6263В отличие от [`TemporaryFile()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.6465Если *suffix* не равен `None`, имя файла будет заканчиваться на этот суффикс, иначе суффикса не будет. [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало *suffix*.6667Если *prefix* не равен `None`, имя файла будет начинаться с этого префикса; иначе используется префикс по умолчанию. По умолчанию берётся возвращаемое значение [`gettempprefix()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempprefix) или [`gettempprefixb()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempprefixb), в зависимости от ситуации.6869Если *dir* не равен `None`, файл будет создан в этом каталоге; иначе используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Поэтому нет гарантии, что сгенерированное имя файла будет обладать какими-либо полезными свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.7071Если любой из *suffix*, *prefix* и *dir* не равен `None`, они должны быть одного типа. Если они являются bytes, возвращаемое имя будет bytes, а не str. Если нужно принудительно получить bytes при остальных значениях по умолчанию, передайте `suffix=b''`.7273Если указан параметр *text*, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.7475[`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/3.5/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.7677Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.7879#### `tempfile.mkdtemp(suffix=None, prefix=None, dir=None)`8081Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.8283Пользователь [`mkdtemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после использования.8485Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp).8687[`mkdtemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.8889Изменено в версии 3.5: *suffix*, *prefix* и *dir* теперь могут передаваться в байтах для получения возвращаемого значения в байтах. Ранее допускалась только str. *suffix* и *prefix* теперь принимают и по умолчанию равны `None`, чтобы использовать подходящее значение по умолчанию.9091#### `tempfile.gettempdir()`9293Возвращает имя каталога, используемого для временных файлов. Оно определяет значение по умолчанию для аргумента *dir* во всех функциях этого модуля.9495Python просматривает стандартный список каталогов, чтобы найти тот, в котором вызывающий пользователь может создавать файлы. Список:96971. Каталог, заданный переменной окружения `TMPDIR`.982. Каталог, заданный переменной окружения `TEMP`.993. Каталог, заданный переменной окружения `TMP`.1004. Расположение, зависящее от платформы:101102 - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.103 - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1045. В крайнем случае – текущий рабочий каталог.105106Результат этого поиска кэшируется; см. описание [`tempdir`](https://python-all.ru/3.5/library/tempfile.html#tempfile.tempdir) ниже.107108#### `tempfile.gettempdirb()`109110То же, что [`gettempdir()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempdir), но возвращаемое значение в байтах.111112Новое в версии 3.5.113114#### `tempfile.gettempprefix()`115116Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.117118#### `tempfile.gettempprefixb()`119120То же, что [`gettempprefix()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempprefix), но возвращаемое значение в байтах.121122Новое в версии 3.5.123124Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращаемых функцией [`gettempdir()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempdir). Её можно установить напрямую, чтобы переопределить процесс выбора, но этого делать не рекомендуется. Все функции в этом модуле принимают аргумент *dir*, который можно использовать для указания каталога, и это рекомендуемый подход.125126#### `tempfile.tempdir`127128Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* функций, определённых в этом модуле.129130Если `tempdir` не установлена или `None` при любом вызове любой из указанных выше\\nфункций, кроме [`gettempprefix()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempprefix), она инициализируется в соответствии с\\nалгоритмом, описанным в [`gettempdir()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.gettempdir).131132## 11.6.1. Примеры133134Вот несколько примеров типичного использования модуля [`tempfile`](https://python-all.ru/3.5/library/tempfile.html#module-tempfile):135136```python137>>> import tempfile138139# create a temporary file and write some data to it140>>> fp = tempfile.TemporaryFile()141>>> fp.write(b'Hello world!')142# read data from file143>>> fp.seek(0)144>>> fp.read()145b'Hello world!'146# close the file, it will be removed147>>> fp.close()148149# create a temporary file using a context manager150>>> with tempfile.TemporaryFile() as fp:151... fp.write(b'Hello world!')152... fp.seek(0)153... fp.read()154b'Hello world!'155>>>156# file is now closed and removed157158# create a temporary directory using the context manager159>>> with tempfile.TemporaryDirectory() as tmpdirname:160... print('created temporary directory', tmpdirname)161>>>162# directory and contents have been removed163```164165## 11.6.2. Устаревшие функции и переменные166167Раньше для создания временных файлов сначала генерировали имя с помощью функции [`mktemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mktemp), а затем создавали файл с этим именем. К сожалению, это небезопасно, так как другой процесс может создать файл с таким именем в промежутке между вызовом [`mktemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mktemp) и последующей попыткой первого процесса создать файл. Решение – объединить два шага и создавать файл сразу. Этот подход используется в [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) и других описанных выше функциях.168169#### `tempfile.mktemp(suffix='', prefix='tmp', dir=None)`170171Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp) вместо.172173Возвращает абсолютное имя пути к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* аналогичны аргументам [`mkstemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mkstemp), за исключением того, что имена файлов в байтах, `suffix=None` и `prefix=None` не поддерживаются.174175> **Предупреждение**176>177> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/3.5/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:178>179> ```python180> >>> f = NamedTemporaryFile(delete=False)181> >>> f.name182> '/tmp/tmptjujjt'183> >>> f.write(b"Hello World!\n")184> 13185> >>> f.close()186> >>> os.unlink(f.name)187> >>> os.path.exists(f.name)188> False189> ```190