tempfile — Создание временных файлов и папок
Модуль tempfile используется для генерации временных файлов и директорий. Он кроссплатформенный и работает безопасно: временные папки создаются с правильными правами доступа, чтобы только запустивший код юзер имел к ним доступ.
Лучший способ работы — использование контекстных менеджеров (with), так как они гарантированно уничтожают временный мусор сразу после выхода из блока.
import tempfile
Временные директории
Частый сценарий: скачать tar.gz из сети, распаковать, обработать файлы и всё удалить, не засоряя жесткий диск сервера.
import tempfile
import os
# Создаст папку где-то в /tmp/ и уничтожит её при окончании 'with'
with tempfile.TemporaryDirectory() as temp_dir:
print(f"Успешно создана папка: {temp_dir}")
# Работаем как с обычной папкой
filepath = os.path.join(temp_dir, 'log.txt')
with open(filepath, 'w') as f:
f.write("Секретные данные на пару секунд.")
print("Папка полностью удалена.")
# Убедимся:
# print(os.path.exists(temp_dir)) возвращает False!
Выделенные временные файлы (в ОЗУ)
Если нужно буферизировать или собрать большой файл без сохранения директории, применяются временные объекты (по сути "фейковые" файлы).
import tempfile
# SpooledTemporaryFile держит данные в оперативной памяти (RAM)
# и переносит их на жесткий диск, только если они превысят max_size в байтах.
with tempfile.SpooledTemporaryFile(max_size=2000, mode='w+') as tfile:
tfile.write("Тестовые данные")
tfile.seek(0) # Перемотка "каретки" назад перед чтением
current = tfile.read()
print(current)
Если вам все же нужно передать физический путь файла другой программе, используйте NamedTemporaryFile(delete=False).
Полный справочник API (API Reference)
Главные классы (Менеджеры контекста)
| Класс | Описание |
|---|---|
tempfile.TemporaryFile(mode='w+b') |
Возвращает анонимный файловый объект (удаляется сразу при закрытии). |
tempfile.NamedTemporaryFile() |
Аналог TemporaryFile, но гарантированно имеет видимое имя файла в ОС. Доступно через атрибут .name. На Windows закрытие такого файла сторонней программой может вызвать ошибку. |
tempfile.SpooledTemporaryFile() |
Начинает писать как StringIO (чисто в RAM), пока не достигнет лимита, затем становится физическим TemporaryFile. Максимальная скорость для мелких файлов. |
tempfile.TemporaryDirectory() |
Возвращает строку — абсолютный путь к папке. Папка удаляется вместе со ВСЕМ её содержимым при выходе из with. |
Функции
| Функция | Описание |
|---|---|
tempfile.mkdtemp() |
Создает папку и возвращает путь к ней. Внимание: В отличие от TemporaryDirectory, эту папку нужно удалять ВРУЧНУЮ через shutil.rmtree(). |
tempfile.gettempdir() |
Возвращает стандартную папку ОС для хранения кэша (в Windows это C:\Temp, в Linux — /tmp). |