tempfile.md
1> **Источник:** https://python-all.ru/2.7/library/tempfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10.6. [`tempfile`](https://python-all.ru/2.7/library/tempfile.html#module-tempfile) – Генерация временных файлов и каталогов89**Исходный код:** [Lib/tempfile.py](https://python-all.ru/src/2.7/Lib/tempfile.py)1011---1213Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах.1415В версии Python 2.3 этот модуль был переработан для повышения безопасности. Теперь он предоставляет три новые функции: [`NamedTemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.NamedTemporaryFile), [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp) и [`mkdtemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkdtemp), которые должны устранить все оставшиеся причины использовать небезопасную функцию [`mktemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mktemp). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.1617Кроме того, все вызываемые пользователем функции теперь принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов. Больше нет необходимости использовать глобальные переменные *tempdir* и *template*. Для сохранения обратной совместимости порядок аргументов несколько необычен; рекомендуется использовать именованные аргументы для ясности.1819Модуль определяет следующие функции, которые могут вызываться пользователем:2021#### `tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])`2223Возвращает файлоподобный объект, который можно использовать как временное хранилище. Файл создаётся с помощью [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp). Он будет уничтожен сразу после закрытия (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла удаляется сразу после его создания. Другие платформы этого не поддерживают; ваш код не должен полагаться на то, что временный файл, созданный с помощью этой функции, имеет или не имеет видимое имя в файловой системе.2425Параметр *mode* по умолчанию равен `'w+b'`, чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он работал одинаково на всех платформах независимо от хранящихся данных. *bufsize* по умолчанию равен `-1`, то есть используются настройки операционной системы.2627Параметры *dir*, *prefix* и *suffix* передаются в [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp).2829На платформах POSIX возвращаемый объект является настоящим файловым объектом. На других платформах это файлоподобный объект, чей атрибут `file` является базовым настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with), как обычный файл.3031#### `tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])`3233Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись каталога не удаляется). Это имя можно получить из атрибута `name` возвращаемого файлоподобного объекта. Можно ли использовать это имя для повторного открытия файла, пока именованный временный файл ещё открыт, зависит от платформы (в Unix можно; в Windows NT и новее нельзя). Если *delete* равно true (по умолчанию), файл удаляется сразу после закрытия.3435Возвращаемый объект всегда является файлоподобным объектом, чей атрибут `file` является базовым настоящим файловым объектом. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with), как обычный файл.3637Новое в версии 2.3.3839Новое в версии 2.6: Параметр *delete*.4041#### `tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])`4243Эта функция работает точно так же, как [`TemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.TemporaryFile), за исключением того, что данные буферизуются в памяти, пока размер файла не превысит *max\_size* или не будет вызван метод `fileno()` файла. В этот момент содержимое записывается на диск, и работа продолжается как с [`TemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.TemporaryFile). Кроме того, метод `truncate` не принимает аргумент `size`.4445У полученного файла есть один дополнительный метод, `rollover()`, который вызывает переключение на файл на диске независимо от его размера.4647Возвращаемый объект является файлоподобным объектом, чей атрибут `_file` является либо объектом [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO), либо настоящим файловым объектом, в зависимости от того, был ли вызван `rollover()`. Этот файлоподобный объект можно использовать в операторе [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with), как обычный файл.4849Новое в версии 2.6.5051#### `tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])`5253Создаёт временный файл наиболее безопасным способом. В процессе создания файла не возникает состояний гонки, если платформа правильно реализует флаг [`os.O_EXCL`](https://python-all.ru/2.7/library/os.html#os.O_EXCL) для [`os.open()`](https://python-all.ru/2.7/library/os.html#os.open). Файл доступен для чтения и записи только создавшему его пользователю. Если платформа использует биты разрешений для указания на исполняемость файла, то файл не является исполняемым никем. Файловый дескриптор не наследуется дочерними процессами.5455В отличие от [`TemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.TemporaryFile), пользователь [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp) отвечает за удаление временного файла после завершения работы с ним.5657Если указан *suffix*, имя файла будет заканчиваться этим суффиксом, иначе суффикса не будет. [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp) не ставит точку между именем файла и суффиксом; если нужна точка, поставьте её в начале *suffix*.5859Если указан *prefix*, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.6061Если указан *dir*, файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, установив переменные окружения *TMPDIR*, *TEMP* или *TMP*. Таким образом, нет гарантии, что сгенерированное имя файла будет обладать какими-либо хорошими свойствами, например, не требовать экранирования при передаче внешним командам через `os.popen()`.6263Если указан параметр *text*, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.6465[`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp) возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как возвращается [`os.open()`](https://python-all.ru/2.7/library/os.html#os.open)) и абсолютное имя пути к этому файлу, в указанном порядке.6667Новое в версии 2.3.6869#### `tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])`7071Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.7273Пользователь [`mkdtemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkdtemp) отвечает за удаление временного каталога и его содержимого после использования.7475Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp).7677[`mkdtemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkdtemp) возвращает абсолютный путь к новому каталогу.7879Новое в версии 2.3.8081#### `tempfile.mktemp([suffix=''[, prefix='tmp'[, dir=None]]])`8283Устарело с версии 2.3: Используйте [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp) вместо.8485Возвращает абсолютный путь к файлу, который не существовал на момент вызова. Аргументы *prefix*, *suffix* и *dir* такие же, как для [`mkstemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mkstemp).8687> **Предупреждение**88>89> Использование этой функции может привести к дыре в безопасности программы. К тому моменту, когда вы начнёте что-либо делать с возвращённым именем файла, кто-то другой может вас опередить. Использование [`mktemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mktemp) можно легко заменить на [`NamedTemporaryFile()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.NamedTemporaryFile), передав ему параметр `delete=False`:90>91> ```python92> >>> f = NamedTemporaryFile(delete=False)93> >>> f94> <open file '<fdopen>', mode 'w+b' at 0x384698>95> >>> f.name96> '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0'97> >>> f.write("Hello World!\n")98> >>> f.close()99> >>> os.unlink(f.name)100> >>> os.path.exists(f.name)101> False102> ```103104Модуль использует глобальную переменную, которая сообщает ему, как построить временное имя. Они инициализируются при первом вызове любой из описанных выше функций. Вызывающий код может изменить их, но этого делать не рекомендуется; вместо этого следует использовать соответствующие аргументы функции.105106#### `tempfile.tempdir`107108Если задано значение, отличное от `None`, эта переменная определяет значение по умолчанию для аргумента *dir* всех функций, определённых в этом модуле.109110Если `tempdir` не установлена или равна `None` при любом вызове любой из вышеперечисленных функций, Python просматривает стандартный список каталогов и устанавливает *tempdir* в первый каталог, в котором вызывающий пользователь может создавать файлы. Список:1111121. Каталог, заданный переменной окружения `TMPDIR`.1132. Каталог, заданный переменной окружения `TEMP`.1143. Каталог, заданный переменной окружения `TMP`.1154. Расположение, зависящее от платформы:116117 - На RiscOS – каталог, заданный переменной окружения `Wimp$ScrapDir`.118 - В Windows – каталоги `C:\TEMP`, `C:\TMP`, `\TEMP` и `\TMP` в указанном порядке.119 - На всех остальных платформах – каталоги `/tmp`, `/var/tmp` и `/usr/tmp` в указанном порядке.1205. В крайнем случае – текущий рабочий каталог.121122#### `tempfile.gettempdir()`123124Возвращает каталог, выбранный в данный момент для создания временных файлов. Если [`tempdir`](https://python-all.ru/2.7/library/tempfile.html#tempfile.tempdir) не равно `None`, просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.125126Новое в версии 2.3.127128#### `tempfile.template`129130Устарело с версии 2.0: Вместо этого используйте [`gettempprefix()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.gettempprefix).131132Если задано значение, отличное от `None`, эта переменная определяет префикс конечного компонента имён файлов, возвращаемых [`mktemp()`](https://python-all.ru/2.7/library/tempfile.html#tempfile.mktemp). Для обеспечения уникальности к префиксу добавляется строка из шести случайных букв и цифр. Префикс по умолчанию – `tmp`.133134В старых версиях этого модуля требовалось устанавливать `template` в `None` после вызова [`os.fork()`](https://python-all.ru/2.7/library/os.html#os.fork); начиная с версии 1.5.2 это не требуется.135136#### `tempfile.gettempprefix()`137138Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога. Использование этой функции предпочтительнее прямого чтения переменной *template*.139140Новое в версии 1.5.2.141