Вступление
Временные файлы, или «временные файлы», в основном используются для хранения промежуточной информации на диске для приложения. Эти файлы обычно создаются для различных целей, таких как временное резервное копирование или если приложение работает с большим набором данных, превышающим системную память и т. Д. В идеале эти файлы находятся в отдельном каталоге, который зависит от разных операционных систем, и имена этих файлов уникальны. Данные, хранящиеся во временных файлах, не всегда требуются после выхода из приложения, поэтому вы можете захотеть удалить эти файлы после использования.
Python предоставляет модуль, известный как
tempfile , который
упрощает создание и обработку временных файлов. Этот модуль
предоставляет несколько методов для создания временных файлов и
каталогов разными способами. tempfile
пригодится всякий раз, когда вы
хотите использовать временные файлы для хранения данных в программе
Python. Давайте рассмотрим несколько разных примеров того, как можно
использовать модуль tempfile
Создание временного файла
Предположим, вашему приложению нужен временный файл для использования в
программе, т.е. оно создаст один файл, будет использовать его для
хранения некоторых данных, а затем удалит его после использования. Для
этого мы можем использовать функцию TemporaryFile()
Эта функция создает один временный файл по умолчанию tempfile
места.
Это расположение может отличаться в зависимости от операционной системы.
Самое приятное то, что временный файл, созданный TemporaryFile()
будет
автоматически удаляться при закрытии файла. Кроме того, он не создает
никаких ссылок на этот файл в таблице файловой системы системы. Это
делает его закрытым для текущего приложения, т.е. никакая другая
программа не сможет открыть файл.
Давайте посмотрим на приведенную ниже программу 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
- Чтобы создать один временный файл в Python, вам необходимо
импортировать модуль
tempfile
- Как объяснялось выше, мы создали временный файл с помощью функции
TemporaryFile()
. - Из вывода вы можете видеть, что созданный объект на самом деле не
файл, это объект, подобный файлу. И
mode
(не показанный в нашем примере) созданного файла -w+b
, то есть вы можете читать и писать, не закрываясь. - Созданный временный файл не имеет имени.
- Наконец, мы закрываем файл с помощью метода
close()
Он будет уничтожен после закрытия.
Следует отметить, что файл, созданный с помощью функции
TemporaryFile()
может иметь или не иметь видимого имени в файловой
системе. В Unix запись в каталоге для файла автоматически удаляется
после его создания, хотя на других платформах это не поддерживается.
Обычно TemporaryFile()
- идеальный способ создать одну временную
область хранения для любой программы на Python.
Создать именованный временный файл
В нашем предыдущем примере мы видели, что временный файл, созданный с
помощью функции TemporaryFile()
самом деле является файловым объектом
без фактического имени файла. Python также предоставляет другой метод,
NamedTemporaryFile()
, для создания файла с видимым именем в
файловой системе. За исключением NamedTemporaryFile()
работает так же,
как TemporaryFile()
. Теперь давайте воспользуемся тем же примером
выше для создания именованного временного файла:
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: <tempfile._TemporaryFileWrapper object at 0x103f22ba8>
Name of the file is: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpa3rq8lon
Closing the temp file
Итак, на этот раз у созданного файла действительно есть имя.
Преимущество NamedTemporaryFile()
том, что мы можем сохранить имя
созданных временных файлов и использовать их позже, прежде чем закрывать
или уничтожать их. Если для delete
установлено значение False
, то
мы можем закрыть файл без его уничтожения, что позволит нам повторно
открыть его позже.
Предоставление суффикса или префикса имени
Иногда нам нужно добавить префикс или суффикс к имени временного файла. Это поможет нам идентифицировать все временные файлы, созданные нашей программой.
Для этого мы можем использовать ту же NamedTemporaryFile
определенную
выше. Единственное, что нам нужно добавить, это два дополнительных
параметра при вызове этой функции: suffix
и prefix
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: <tempfile._TemporaryFileWrapper object at 0x102183470>
Name of the file is: /var/folders/tp/pn3dvz_n7cj7nfs0y2szsk9h0000gn/T/dummyPrefix_uz63brcp_dummySuffix
Итак, если мы передадим два дополнительных аргумента, suffix
и
prefix
в NamedTemporaryFile()
, она автоматически добавит их в
начало и конец имени файла.
Поиск местоположения временных файлов по умолчанию
tempfile.tempdir
содержит расположение по умолчанию для всех временных
файлов. Если значение tempdir
равно None
или не установлено, Python
будет искать в стандартном списке каталогов и устанавливает для
tempdir
значение первого каталога, но только если вызывающая программа
может создать в нем файл. Ниже приводится список каталогов, которые он
будет сканировать в следующем порядке:
- Каталог, названный переменной среды TMPDIR.
- Каталог, названный переменной среды TEMP.
- Каталог, названный переменной среды TMP
- Каталоги для конкретных платформ:
- В Windows C: \ TEMP, C: \ TMP, \ TEMP и \ TMP в том же порядке.
- На других платформах / tmp, / var / tmp и / usr / tmp в том же порядке.
- Текущий рабочий каталог.
Чтобы узнать расположение временных файлов по умолчанию, мы можем
вызвать метод 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()
Это напечатает результат как b'Hello world!'
поскольку метод write()
принимает входные данные в байтах (отсюда и b
в строке).
Если вы хотите записать текстовые данные во временный файл, вы можете
вместо этого writelines()
Для использования этого метода нам нужно
создать временный файл, используя w+t
вместо режима по умолчанию w+b
. Для этого, mode
пары могут быть переданы в TemporaryFile()
, чтобы
изменить режим созданного временного файла.
import tempfile
temp = tempfile.TemporaryFile(mode='w+t')
try:
temp.writelines("Hello world!")
temp.seek(0)
print(temp.read())
finally:
temp.close()
В отличие от предыдущего примера, в качестве вывода будет напечатано «Hello World».
Создать временный каталог
Если ваша программа имеет несколько временных файлов, может быть удобнее
создать один временный каталог и поместить в него все ваши временные
файлы. Чтобы создать временный каталог, мы можем использовать функцию
TemporaryDirectory()
После закрытия всех временных файлов нам нужно
удалить каталог вручную.
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()
, мы можем создать временный файл наиболее
безопасным способом. Временный файл, созданный с помощью этого метода,
доступен для чтения и записи только создавшему ID пользователя. Мы можем
передать prefix
и suffix
чтобы добавить префикс и суффикс к имени
созданного файла. По умолчанию он открывает файл в двоичном режиме.
Чтобы открыть его в текстовом режиме, мы можем передать text=True
в
качестве аргумента функции. В отличие от TemporaryFile()
, файл,
созданный 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.