Рубрики
Без рубрики

Модуль Python tempfile

Автор оригинала: N Kaushik.

Модуль Python tempfile

Вступление

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

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

Создание временного файла

Предположим, вашему приложению нужен временный файл для использования в программе, то есть он создаст один файл, будет использовать его для хранения некоторых данных, а затем удалит его после использования. Для этого мы можем использовать функцию Temporary File () .

Эта функция создаст один временный файл в расположении по умолчанию tempfile . Это расположение может отличаться в разных операционных системах. Лучше всего то, что временный файл, созданный Temporary File () , будет автоматически удален всякий раз, когда он будет закрыт. Кроме того, он не создает никакой ссылки на этот файл в таблице файловой системы системы. Это делает его закрытым для текущего приложения, то есть никакая другая программа не сможет открыть файл.

Давайте взглянем на приведенную ниже программу Python, чтобы увидеть, как она работает:

import tempfile #1

print("Creating one temporary file...")

temp = tempfile.TemporaryFile() #2

try:
    print("Created file is:", temp) #3
    print("Name of the file is:", temp.name) #4
finally:
    print("Closing the temp file")
    temp.close() #5

Он напечатает нижеприведенный вывод:

$ python3 temp-file.py
Creating one temporary file...
Created file is: <_io.BufferedRandom name=4>
Name of the file is: 4
Closing the temp file
  1. Чтобы создать один временный файл в Python, вам нужно импортировать модуль tempfile .
  2. Как было объяснено выше, мы создали временный файл с помощью функции Temporary File () .
  3. Из выходных данных вы можете видеть, что созданный объект на самом деле не является файлом, это файлоподобный объект. И параметр mode (не показанный в нашем примере) созданного файла равен w+b , то есть вы можете читать и писать без закрытия.
  4. Созданный временный файл не имеет имени.
  5. Наконец, мы закрываем файл с помощью метода close () . Он будет уничтожен после того, как его закроют.

Следует отметить, что файл, созданный с помощью функции Temporary File () , может иметь или не иметь видимого имени в файловой системе. В Unix запись каталога для файла удаляется автоматически после его создания, хотя это не поддерживается на других платформах. Обычно Temporary File () – это идеальный способ создать одну временную область хранения для любой программы на Python.

Создайте именованный временный файл

В нашем предыдущем примере мы видели, что временный файл, созданный с помощью функции Temporary File () , на самом деле является файлоподобным объектом без фактического имени файла. Python также предоставляет другой метод, NamedTemporaryFile() , для создания файла с видимым именем в файловой системе. Кроме указания имени для tempfile, NamedTemporaryFile() работает так же, как Temporary File() . Теперь давайте воспользуемся тем же приведенным выше примером для создания именованного временного файла:

import tempfile

print("Creating one named temporary file...")

temp = tempfile.NamedTemporaryFile()

try:
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
finally:
    print("Closing the temp file")
    temp.close()

Запуск этого кода приведет к печати вывода, аналогичного следующему:

$ python3 named-temp-file.py
Creating one named temporary file...
Created file is: 
Name of the file is: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpa3rq8lon
Closing the temp file

Итак, на этот раз у созданного файла действительно есть имя. Преимущество NamedTemporaryFile() заключается в том, что мы можем сохранить имя созданных временных файлов и использовать их позже, прежде чем закрывать или уничтожать их. Если параметр delete имеет значение False , то мы можем закрыть файл без его уничтожения, что позволит нам снова открыть его позже.

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

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

Для достижения этой цели мы можем использовать ту же функцию NamedTemporaryFile , определенную выше. Единственное, что нам нужно добавить, – это два дополнительных параметра при вызове этой функции: суффикс и префикс

import tempfile

temp = tempfile.NamedTemporaryFile(prefix="dummyPrefix_", suffix="_dummySuffix")

try:
    print("Created file is:", temp)
    print("Name of the file is:", temp.name)
finally:
    temp.close()

Запуск этого кода приведет к печати следующих выходных данных:

$ python3 prefix-suffix-temp-file.py
Created file is: 
Name of the file is: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T/dummyPrefix_uz63brcp_dummySuffix

Таким образом, если мы передадим два дополнительных аргумента suffix и prefix функции NamedTemporaryFile () , она автоматически добавит их в начало и конец имени файла.

Поиск расположения временных файлов по умолчанию

Переменная tempfile.tempdir содержит расположение по умолчанию для всех временных файлов. Если значение tempdir равно None или unset, Python будет искать стандартный список каталогов и устанавливает tempdir в первое значение каталога, но только в том случае, если вызывающая программа может создать в нем файл. Ниже приведен список каталогов, которые он будет сканировать, в следующем порядке:

  1. Каталог, названный переменной окружения TMPDIR.
  2. Каталог, названный переменной среды TEMP.
  3. Каталог, названный переменной среды TMP
  4. Каталоги для конкретной платформы:
    1. На окнах, C:\TEMP, C:\TMP, \TEMP и \TMP, в том же порядке.
    2. На других платформах/tmp,/var/tmp и/usr/tmp расположены в том же порядке.
  5. Текущий рабочий каталог.

Чтобы узнать расположение временных файлов по умолчанию, мы можем вызвать метод tempfile.gettempdir () . Он вернет значение tempdir , если это не так None . В противном случае он сначала будет искать местоположение каталога, используя шаги, упомянутые выше, а затем вернет его.

import tempfile

print("Current temp directory:", tempfile.gettempdir())

tempfile.tempdir = "/temp"

print("Temp directory after change:", tempfile.gettempdir())

Если вы запустите приведенную выше программу, она выведет результат, подобный следующему:

$ python3 dir-loc-temp-file.py
Current temp directory: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T
Temp directory after change: /temp

Вы можете видеть, что первое местоположение временного каталога является системным местоположением каталога, а второе значение временного каталога совпадает с тем, которое мы определили.

Чтение и запись данных из временных файлов

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

Чтение и запись данных из временного файла в Python довольно просты. Для записи вы можете использовать метод write () , а для чтения-метод read () . Например:

import tempfile

temp = tempfile.TemporaryFile()

try:
    temp.write(b'Hello world!')
    temp.seek(0)

    print(temp.read())
finally:
    temp.close()

Это выведет выходные данные как 'hello world!' так как метод write() принимает входные данные в байтах (отсюда и префикс b в строке).

Если вы хотите записать текстовые данные во временный файл, вы можете использовать вместо этого метод writelines () . Для использования этого метода нам нужно создать tempfile с использованием режима w+t вместо режима по умолчанию w+b . Для этого в Temporary File () можно передать параметр mode param для изменения режима созданного временного файла.

import tempfile

temp = tempfile.TemporaryFile(mode='w+t')

try:
    temp.writelines("Hello world!")
    temp.seek(0)

    print(temp.read())
finally:
    temp.close()

В отличие от предыдущего примера, на выходе будет выведено “Hello World”.

Создание временного каталога

Если ваша программа имеет несколько временных файлов, может быть удобнее создать один временный каталог и поместить в него все ваши временные файлы. Чтобы создать временный каталог, мы можем использовать функцию Temporary Directory () . После того как все временные файлы будут закрыты, нам нужно удалить каталог вручную.

import tempfile

with tempfile.TemporaryDirectory() as tmpdirname:
    print('Created temporary directory:', tmpdirname)

# Both the directory and its contents have been deleted

Он напечатает нижеприведенный вывод:

$ python3 mk-dir-temp-file.py
Created temporary directory: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpn_ke7_rk

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

Используя mkstemp() , мы можем создать временный файл самым безопасным способом. Временный файл, созданный с помощью этого метода, доступен для чтения и записи только по идентификатору создающего пользователя. Мы можем передать аргументы prefix и suffix , чтобы добавить префикс и суффикс к созданному имени файла. По умолчанию он открывает файл в двоичном режиме. Чтобы открыть его в текстовом режиме, мы можем передать text=True в качестве аргумента функции. В отличие от Temporary File() , файл, созданный mkstemp () , не удаляется автоматически после его закрытия.

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

import tempfile
import os

temp_directory = tempfile.TemporaryDirectory()

print("Directory name:", temp_directory)

os.removedirs(temp_directory)
$ python3 mk-secure-dir-temp-file.py
Directory name: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T/tmpf8f6xc53

Подобно mkstemp() , мы можем создать временный каталог наиболее безопасным способом, используя метод mkdtemp () . И опять же, как и mkstemp() , он также поддерживает аргументы prefix и suffix для добавления префикса и суффикса к имени каталога.

Вывод

В этой статье мы изучили различные способы создания временных файлов и каталогов в Python. Вы можете использовать временные файлы в любой программе Python, которую вы хотите. Но просто убедитесь, что вы удалили его, если конкретный используемый метод не удаляет его автоматически сам по себе. Также имейте в виду, что поведение может отличаться в разных операционных системах, например, имена выходных каталогов и имена файлов.

Все эти функции, которые мы объяснили выше, работают со многими различными аргументами, хотя мы не рассматривали подробно, какой тип аргументов принимает каждая функция. Если вы хотите узнать больше о модуле tempfile , вам следует ознакомиться с официальной документацией Python 3 .