Практическое руководство по временным файлам в коде

Раздел: Python -> Файловый ввод-вывод

Основное решение: NamedTemporaryFile с контекстным менеджером

Как создать временный файл, который автоматически удаляется после использования?

Модуль tempfile предоставляет класс NamedTemporaryFile. При использовании с конструкцией with файл создается во временной директории системы и гарантированно удаляется после выхода из блока. Это самый надежный способ для одноразовых данных.


import tempfile

with tempfile.NamedTemporaryFile(mode='w+t', suffix='.txt', prefix='tmp_', delete=True) as temp:
    temp.write('Временные данные')
    temp.seek(0)
    print(temp.read())
  

ввод программ на python (ввод данных в программе python)

Результат:

Временные данные

Python file io (ввод-вывод файлов в python)

Параметр delete=True (по умолчанию) обеспечивает автоматическое удаление. Режим 'w+t' позволяет и запись, и чтение текста. Суффикс и префикс помогают идентифицировать файл.

Типичные ошибки:

  • На Windows файл может быть заблокирован другим процессом. Решение: использовать delete=False и удалять вручную после закрытия.
  • Забыть закрыть файл до того, как он будет нужен другому процессу. Контекстный менеджер решает эту проблему.
  • Попытка обратиться к файлу по пути после закрытия (если delete=True) - файл уже удален.

Цель использования: обработка временных данных, тестирование, безопасное кэширование без засорения файловой системы.

Как создать безымянный временный файл, недоступный для других процессов?

Класс TemporaryFile создает анонимный временный файл без имени в файловой системе. Он не имеет жесткой ссылки, поэтому доступен только через объект файла.


import tempfile

with tempfile.TemporaryFile(mode='w+b') as temp:
    temp.write(b'Binary data')
    temp.seek(0)
    print(temp.read())
  

Python temp files (временные файлы в python)

Результат:

b'Binary data'

Python index files (индексация файлов в python)

Файл создается в системной временной директории, но его имя не раскрывается. Это повышает безопасность при работе с конфиденциальными данными.

Нельзя передать путь к файлу другому процессу. Если требуется совместный доступ, используйте NamedTemporaryFile.

Как сохранить временный файл после закрытия контекста?

Установите delete=False в NamedTemporaryFile. Файл не будет удален при выходе из контекста, и вы сможете использовать его позже.


import tempfile
import os

with tempfile.NamedTemporaryFile(mode='w+t', suffix='.tmp', delete=False) as temp:
    temp.write('Сохраняемые данные')
    name = temp.name

# Файл существует
print(os.path.isfile(name))  # True
os.unlink(name)  # ручное удаление
  

File python class (класс для работы с файлами в python)

Результат:

True

Python file utf 8 (кодировка utf-8 для файлов в python)

После ручного удаления файл исчезает. Этот вариант полезен, когда временный файл нужно передать другому процессу или сохранить для отладки.

Ошибка: забыли удалить файл, что приводит к засорению временной директории. Рекомендуется оборачивать удаление в finally или использовать контекстный менеджер с delete=True.

Как создать временную директорию для нескольких файлов?

Класс TemporaryDirectory создает временную папку, которая удаляется вместе со всем содержимым после выхода из контекста.


import tempfile
import os

with tempfile.TemporaryDirectory() as tmpdir:
    file_path = os.path.join(tmpdir, 'data.txt')
    with open(file_path, 'w') as f:
        f.write('Текст внутри временной папки')
    print(os.listdir(tmpdir))
# После выхода папка удалена
  

Python config files (конфигурационные файлы в python)

Результат:

['data.txt']

Python copy file (копирование файла в python)

Удобно для временных проектов, тестов, нуждающихся в нескольких файлах. Безопасно: все удаляется автоматически.

Если внутри папки созданы вложенные структуры, они также удаляются. Будьте осторожны, если папка используется асинхронно.

Как создать временный файл, хранящий данные в памяти до определенного размера?

Класс SpooledTemporaryFile держит данные в байтовом буфере в памяти, пока их объем не превысит max_size. После превышения данные сбрасываются на диск.


import tempfile

with tempfile.SpooledTemporaryFile(max_size=100, mode='w+t') as spool:
    spool.write('a' * 50)
    print(type(spool._file))  # io.StringIO (в памяти)
    spool.write('b' * 100)    # превышает max_size
    print(type(spool._file))  # файл на диске
  

Python log file (логирование в файл в python)

Результат:

<class 'io.StringIO'>
<class 'tempfile.SpooledTemporaryFile'> (фактически NamedTemporaryFile)

Python file methods (методы работы с файлами в python)

Полезен для логов или данных, которые могут быть как малыми, так и большими. Экономит дисковые операции при малых объемах.

Параметр max_size задается в байтах. Если данные часто превышают лимит, преимущество теряется.

Как создать временный файл с низкоуровневым контролем (файловый дескриптор)?

Функции mkstemp и mkdtemp возвращают файловый дескриптор и путь. Они не управляют автоматическим удалением.


import tempfile
import os

fd, path = tempfile.mkstemp(suffix='.txt', prefix='low_', dir=None)
try:
    with os.fdopen(fd, 'w') as f:
        f.write('Данные')
finally:
    os.unlink(path)  # удаляем вручную
  

Этот способ дает полный контроль, но требует явного закрытия и удаления. Используется в редких случаях, когда стандартные классы не подходят (например, при работе с подпроцессами).

Ошибка: не закрыть дескриптор - утечка ресурсов. Всегда использовать os.fdopen или close в блоке finally.

Выбор метода зависит от сценария: NamedTemporaryFile - стандарт для большинства задач, TemporaryFile - при повышенных требованиях к безопасности, TemporaryDirectory - для комплексных временных структур, SpooledTemporaryFile - когда размер данных непредсказуем, mkstemp/mkdtemp - для низкоуровневых операций.

- Python open file read (открытие файла для чтения в python)
- Python file position (позиционирование в файле python)
- Python line find (поиск строки в файле python)

Расширенные примеры работы с временными файлами

Пример 1: TemporaryFile для бинарных данных с изображением

Создадим временный файл для обработки изображения, не записывая его на диск постоянно.

Пример

import tempfile
import urllib.request

image_url = 'https://httpbin.org/image/png'
with tempfile.TemporaryFile(mode='w+b') as tmp:
    with urllib.request.urlopen(image_url) as response:
        tmp.write(response.read())
    tmp.seek(0)
    # Обработка данных (например, подсчет размера)
    data = tmp.read()
    print(f'Размер изображения: {len(data)} байт')

Результат:

Размер изображения: 8090 байт

Файл существует только в оперативной памяти (буфер диска) и автоматически удаляется. Никаких следов на диске.

Пример 2: NamedTemporaryFile с кастомной директорией

Иногда необходимо размещать временный файл в определенной папке, например, в проекте.

Пример

import tempfile
import os

dir_path = os.path.abspath('./my_temp')
os.makedirs(dir_path, exist_ok=True)

with tempfile.NamedTemporaryFile(dir=dir_path, suffix='.log', delete=False) as f:
    f.write(b'Log entry')
    print(f'Файл создан в: {f.name}')
os.unlink(f.name)  # ручное удаление

Результат:

Файл создан в: /.../my_temp/tmpXYZ.log

Важно: при delete=True файл будет удален автоматически, но указанная директория должна существовать.

Ошибка: если директория не существует, возникает FileNotFoundError.

Пример 3: TemporaryDirectory с подкаталогами и файлами

Создадим временную структуру для тестирования.

Пример

import tempfile
import os

with tempfile.TemporaryDirectory() as tmp_dir:
    sub_dir = os.path.join(tmp_dir, 'sub')
    os.makedirs(sub_dir)
    file1 = os.path.join(tmp_dir, 'a.txt')
    file2 = os.path.join(sub_dir, 'b.txt')
    with open(file1, 'w') as f: f.write('A')
    with open(file2, 'w') as f: f.write('B')
    print('Содержимое временной папки:')
    for root, dirs, files in os.walk(tmp_dir):
        print(root, files)
# После выхода все удалено

Результат:

Содержимое временной папки:
/.../tmpXXXXXX ['a.txt']
/.../tmpXXXXXX/sub ['b.txt']

Пример 4: SpooledTemporaryFile с крупными данными

Покажем, как меняется тип при превышении max_size.

Пример

import tempfile

with tempfile.SpooledTemporaryFile(max_size=10, mode='w+t') as sf:
    sf.write('hello')
    sf.seek(0)
    print('До превышения:', type(sf._file).__name__)
    sf.seek(0, 2)  # в конец
    sf.write(' world!' * 10)  > 10
    sf.seek(0)
    print('После превышения:', type(sf._file).__name__)

Результат:

До превышения: StringIO
После превышения: TemporaryFile

Пример 5: mkstemp для работы с подпроцессом

Создадим временный файл, передадим его имя внешней команде.

Пример

import tempfile
import subprocess
import os

fd, path = tempfile.mkstemp(suffix='.py')
try:
    with os.fdopen(fd, 'w') as f:
        f.write('print("Hello from temp")')
    subprocess.run(['python', path])
finally:
    os.unlink(path)

Результат:

Hello from temp

Пример 6: Временный файл для сериализации pickle

Сохраним объект в временный файл и загрузим обратно.

Пример

import tempfile
import pickle

data = {'key': [1, 2, 3], 'text': 'пример'}

with tempfile.NamedTemporaryFile(mode='w+b', delete=False) as f:
    pickle.dump(data, f)
    f.seek(0)
    loaded = pickle.load(f)
    print(loaded)
os.unlink(f.name)

Результат:

{'key': [1, 2, 3], 'text': 'пример'}

Пример 7: Временный файл в тестах с unittest

Использование TemporaryDirectory в тестовом классе.

Пример

import tempfile
import unittest
import os

class TestTempFile(unittest.TestCase):
    def test_write_read(self):
        with tempfile.NamedTemporaryFile(mode='w+t', suffix='.test', delete=True) as f:
            f.write('тест')
            f.seek(0)
            self.assertEqual(f.read(), 'тест')

if __name__ == '__main__':
    unittest.main()

Результат:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Пример 8: Обработка исключений и гарантированное удаление

Если в блоке возникает ошибка, временный файл все равно удаляется (при delete=True).

Пример

import tempfile

try:
    with tempfile.NamedTemporaryFile(mode='w+t', delete=True) as f:
        f.write('что-то')
        raise ValueError('ошибка')
except ValueError:
    pass
print('Файл удален автоматически, исключение перехвачено')

Результат:

Файл удален автоматически, исключение перехвачено

Пример 9: Кодировка и режим w+t с явной кодировкой

Укажем кодировку для корректной работы с Unicode.

Пример

import tempfile

with tempfile.NamedTemporaryFile(mode='w+t', encoding='utf-8', suffix='.txt') as f:
    f.write('Привет, мир!')
    f.seek(0)
    print(f.read())

Результат:

Привет, мир!

Без указания кодировки на некоторых системах может использоваться ASCII.

Пример 10: Многопоточное создание временных файлов

Каждый поток может создать свой временный файл (безопасно, так как имена уникальны).

Пример

import tempfile
import threading

def worker():
    with tempfile.NamedTemporaryFile(suffix='.tmp', delete=True) as f:
        f.write(threading.current_thread().name.encode())
        print(f'Поток {threading.current_thread().name} создал файл {f.name}')

threads = [threading.Thread(target=worker) for _ in range(3)]
for t in threads: t.start()
for t in threads: t.join()

Результат: (порядок может отличаться)

Поток Thread-1 создал файл /tmp/tmpABC.tmp
Поток Thread-2 создал файл /tmp/tmpDEF.tmp
Поток Thread-3 создал файл /tmp/tmpGHI.tmp

Опасность: если файл используется одновременно несколькими потоками, нужна синхронизация.

Временные файлы в Python - comments

En
Python temp files (python)