Создавайте временные файлы и каталоги в Python с помощью tempfile

Примечание. Для лиц, не являющихся участниками, эта статья также доступна по адресу https://dineshkumarkb.com/tech/create- Contemporary-files-and-directories-in-python-using-tempfile/

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

Конечно, мы всегда можем создать новый файл или каталог и сохранить в нем содержимое файла. Однако мы не можем очистить те файлы, которые больше не нужны.

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

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

  1. TemporaryFile
  2. NamedTemporaryFile
  3. SpooledTemporaryFile
  4. TemporaryDirectory

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

Давайте быстро рассмотрим примеры для каждого.

1. временный файл:

tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

Это возвращает файловый объект для временного хранения. Файл создан безопасно. Когда я говорю «безопасный», это означает, что файл доступен для чтения и записи только создателю, то есть файл доступен только для идентификатора пользователя, создавшего файл.

Для обеспечения согласованности данных на разных платформах для записи в файл используется двоичный режим. Я сохраню параметры suffix и prefix на потом.

import tempfile

file = tempfile.TemporaryFile()
with file as f:
    f.write(b'This is a test temp file')
    f.seek(0)
    print(f.read())
Output:
b'This is a test temp file'

Если вы попытаетесь записать файл в режиме str, вы можете получить следующее typeerror.

TypeError: a bytes-like object is required, not 'str'

2. Именованный временный файл:

tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)

Интерфейс TemporaryFile не имеет видимого имени в файловой системе. Однако у NamedTemporaryFile он есть. Мы должны иметь возможность проверить файл в файловой системе.

Имя файла можно получить из атрибута name файлового объекта.

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

Если для параметра delete установлено значение True, NamedTemporaryFile действует как TemporaryFile и немедленно удаляет файл после его закрытия. Установка значения False сохранит временный файл. Это можно увидеть во временном расположении по умолчанию, сохраненном в файловой системе.

import tempfile
file = tempfile.NamedTemporaryFile(prefix="tmp_", delete=False)
# prints the prefix of the file
print(tempfile.gettempprefix())
# prints the name of the file with path
print(file.name)
with file as f:
    file.write("This is a new named temporary file".encode())
    file.seek(0)
    print(file.read())

Output:
tmp
/tmp/tmp_8uzye08w
b'This is a new named temporary file'

Чтобы получить временный каталог по умолчанию, используйте метод ниже.

import tempfile
print(tempfile.gettempdir())
# When I run the above in ubuntu, I get the below
Output:
/tmp
On windows it will be saved in C:\Users\Temp

3.SpooledTemporaryFile:

tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None

Это работает аналогично TemporaryFile, но с одним отличием. Данные помещаются в буферную память до тех пор, пока размер файла не превысит max_size. После того, как размер файла превышает max_size, содержимое записывается на диск.

file = tempfile.SpooledTemporaryFile(max_size=1000)
with file as f:
    file.write("This is a new spooled temporary file".encode())
    file.seek(0)
    print(file.read())

4. временный каталог:

tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)

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

import tempfile
folder = tempfile.TemporaryDirectory(prefix="tmp_")
with folder as f:
    print(f" Temp dir created", f)
Output:
Temp dir created /tmp/tmp_ep8qgmc5

Временный файл и временный каталог используют mkstemp () и mkdtemp () под капотом соответственно.

Резюме:

  • tempfile можно использовать для создания временных файлов и каталогов в Python
  • Они потокобезопасны и очищаются автоматически.
  • tempfile предоставляет файловые объекты, которые можно использовать как менеджеры контекста.
  • NamedTemporaryFile можно сохранить, установив для параметра delete значение False.
  • gettempprefix(), gettempdir() используются для получения префикса и каталога временных файлов соответственно.
  • tempfiles доступны только пользователям, создавшим файл.

Использованная литература: