Создавайте временные файлы и каталоги в Python с помощью tempfile
Примечание. Для лиц, не являющихся участниками, эта статья также доступна по адресу https://dineshkumarkb.com/tech/create- Contemporary-files-and-directories-in-python-using-tempfile/
Иногда нам может потребоваться создать временные файлы в нашей системе для записи данных в течение короткого периода времени, а затем удалить их позже. Как только такой экземпляр загружает файлы через http
запрос, внесите некоторые изменения и загрузите их в удаленное место или что-то подобное.
Конечно, мы всегда можем создать новый файл или каталог и сохранить в нем содержимое файла. Однако мы не можем очистить те файлы, которые больше не нужны.
Python предоставляет встроенную библиотеку для создания временных файлов и каталогов на всех платформах. Мы можем создавать файловые объекты, которые не зависят от платформы, а также автоматически очищать файлы после выхода из диспетчера контекста файлов.
Библиотека предоставляет пользователю 4 высокоуровневых интерфейса, которые можно использовать в качестве диспетчеров контекста.
- TemporaryFile
- NamedTemporaryFile
- SpooledTemporaryFile
- 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
доступны только пользователям, создавшим файл.