Метка: TMPDIR

Временные файлы и директории

Временные файлы и директории нужны, если промежуточные данные слишком велики, чтобы держать их в оперативной памяти. Или бывают случаи, что программа или компонент обрабатывает только файлы и не может принимать данные по другим каналам.

Для создания временных файлов и директорий есть модуль tempfile. Удобно, что временные файлы создаются в специальном месте ФС и удаляются автоматически после закрытия. Нам можно не думать, куда положить временный файл, как его назвать и как почистить мусор после выполнения программы.

import tempfile

with tempfile.NamedTemporaryFile() as fp:
    print(fp.name)  # путь к файлу
    fp.write(b'Hello world!')
    fp.seek(0)
    print(fp.read())

fp – файло-подобный объект, вроде того, что идет из open. С ним работают также, как с обычным файлом. Он будет удален в момент закрытия.

Есть еще TemporaryFile. Отличие NamedTemporaryFile от TemporaryFile в том, что NamedTemporaryFile будет гарантированно виден в файловой системе и иметь атрибут name, тогда как второй может быть и не виден в ФС. NamedTemporaryFile можно создать с ключем delete=False, чтобы он не был удален. А TemporaryFile всегда будет удален при закрытии.

Режим открытия временного файла по умолчанию "w+b", т.е. можно писать и читать бинарный данные. Можно изменить передав аргумент mode:

tempfile.NamedTemporaryFile(mode='w')

TemporaryDirectory – создает временную директорию и возвращает строку – путь к ней. Мы можем создавать в директории любые файлы в любом количестве. После закрытия контекстного менеджера директория и все файлы в ней будут автоматически удалены. Очень удобно! Можно не запоминать названия или ссылки на файлы. Пример:

with tempfile.TemporaryDirectory() as temp:
    with open(os.path.join(temp, '1.txt'), 'w') as f:
        f.write('hello')

Если надо вручную очистить (можно только 1 раз, после она будет удалена):

tmp = tempfile.TemporaryDirectory()
with open(os.path.join(tmp.name, '1.txt'), 'w') as f:
    f.write('hello')
tmp.cleanup()  # очистка

Узнать где хранятся временные файлы:

>>> tempfile.gettempdir()
'/var/folders/m8/1_wxy73215q9n2vrjetnw0xjc0000gn/T'

Эта директория берется из переменных окружения TMPDIR, TEMP, TEMP или это директория C:\TEMP, C:\TMP, \TEMP и \TMP (для Windows) или /tmp, /var/tmp и /usr/tmp для остальных систем. 

Как поменять место хранения временных данных процесса?

  1. Изменить переменную окружения: TMPDIR="/home/me/temp" python my_program.my
  2. Передать в функции создания временных файлов аргумент dir с нужным путем: tempfile.NamedTemporaryFile(dir='/home/me')

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈