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

Как создать временный файл в python

  • автор:

Модуль tempfile в Python, временные файлы и каталоги

Создание защищенных временных файлов и каталогов для программы

Модуль tempfile создает временные файлы и каталоги. Работает на всех поддерживаемых платформах. Модуль определяет несколько конструкторов высокого уровня, которые обеспечивают автоматическую очистку и могут использоваться в качестве менеджеров контекста. Функции tempfile.mkstemp() и tempfile.mkdtemp() являются функциями более низкого уровня, которые требуют ручной очистки.

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

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

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

Примеры:

Вот несколько примеров типичного использования модуля tempfile :

>>> import tempfile # Создать временный файл и # записать в него некоторые данные >>> fp = tempfile.TemporaryFile() >>> fp.write(b'Hello world!') # Читать данные из файла >>> fp.seek(0) >>> fp.read() # b'Hello world!' # Закройте файл, он будет удален >>> fp.close() 

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

>>> with tempfile.TemporaryFile() as fp: . fp.write(b'Hello world!') . fp.seek(0) . fp.read() # b'Hello world!' >>> # Файл закрыт и удален 

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

>>> with tempfile.TemporaryDirectory() as tmpdirname: . print('created temporary directory', tmpdirname) >>> # Каталог и содержимое были удалены 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Класс TemporaryFile() модуля tempfile
  • Функция NamedTemporaryFile() модуля tempfile
  • Функция SpooledTemporaryFile() модуля tempfile
  • Функция TemporaryDirectory() модуля tempfile
  • Функция mkstemp() модуля tempfile
  • Функция mkdtemp() модуля tempfile
  • Вспомогательные функции модуля tempfile

tempfile — Создание временных файлов и каталогов

Данный модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. TemporaryFile , NamedTemporaryFile , TemporaryDirectory и SpooledTemporaryFile — это интерфейсы высокого уровня, которые обеспечивают автоматическую очистку и могут использоваться в качестве менеджеров контекста. mkstemp() и mkdtemp() — это функции более низкого уровня, требующие ручной очистки.

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

Модуль определяет следующие вызываемые пользователем элементы:

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

Возвращает файлоподобный объект , используемый в качестве временного хранилища. Файл создаётся безопасно по тем же правилам, что и mkstemp() . Он будет уничтожен, как только будет закрыт (включая неявное закрытие при сборке мусора). В Unix запись каталога для файла либо не создаётся вообще, либо удаляется сразу после создания файла. Другие платформы не поддерживают это; ваш код не должен полагаться на временный файл, созданный с помощью этой функции, имеющий или не имеющий видимое имя в файловой системе.

Полученный объект можно использовать в качестве менеджера контекста (см. Примеры ). По завершении контекста или уничтожении файлового объекта временный файл будет удален из файловой системы.

У параметра mode по умолчанию значение ‘w+b’ , чтобы созданный файл можно было читать и записывать, не закрывая его. Двоичный режим используется для того, чтобы он работал одинаково на всех платформах независимо от хранимых данных. buffering, encoding, errors и newline интерпретируются как open() .

Параметры dir, prefix и suffix имеют то же значение и значения по умолчанию, что и для mkstemp() .

Возвращённый объект является истинным файловым объектом на платформах POSIX. На других платформах это файлоподобный объект, атрибут file которого является базовым истинным файловым объектом.

Флаг os.O_TMPFILE используется, если он доступен и работает (зависит от Linux, требуется ядро Linux версии 3.11 или выше).

Вызывает событие аудита tempfile.mkstemp с аргументом fullpath .

Изменено в версии 3.5: Теперь используется флаг os.O_TMPFILE , если он доступен.

Изменено в версии 3.8: Добавлен параметр errors.

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

Данная функция работает точно так же, как TemporaryFile() , за исключением того, что у файла гарантированно есть видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Имя можно получить из атрибута name возвращаемого файлового объекта. Можно ли использовать это имя для открытия файла во второй раз, пока именованный временный файл все ещё открыт, зависит от платформы (его можно использовать в Unix, но нельзя в Windows NT или более поздних версиях). Если у delete значение истина (по умолчанию), файл удаляется сразу после его закрытия. Возвращаемый объект всегда является файлоподобным объектом, атрибут file которого является базовым истинным файловым объектом. Данный файлоподобный объект можно использовать в операторе with , как и обычный файл.

Вызывает событие аудита tempfile.mkstemp с аргументом fullpath .

Изменено в версии 3.8: Добавлен параметр errors.

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 или пока не будет вызван метод файла fileno() , после чего содержимое записывается на диск, и операция продолжается, как в случае с TemporaryFile() .

У результирующего файла есть единственный дополнительный метод rollover() , переносящий файл на дисковый файл независимо от его размера.

Возвращаемый объект представляет собой файлоподобный объект, атрибут _file которого является либо объектом io.BytesIO , либо объектом io.TextIOWrapper (в зависимости от того, был ли указан двоичный или текстовый mode), либо истинным файловым объектом, в зависимости от того, был ли вызван rollover() . Данный файлоподобный объект можно использовать в операторе with , как и обычный файл.

Изменено в версии 3.3: Метод усечения теперь принимает аргумент size .

Изменено в версии 3.8: Добавлен параметр errors.

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

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

Имя каталога можно получить из атрибута name возвращаемого объекта. Когда возвращённый объект используется в качестве менеджера контекста, name будет назначен цели предложения as в операторе with , если таковая имеется.

Каталог можно явно очистить, вызвав метод cleanup() .

Вызывает событие аудита tempfile.mkdtemp с аргументом fullpath .

Добавлено в версии 3.2.

tempfile. mkstemp ( suffix=None, prefix=None, dir=None, text=False )

Создаёт временный файл максимально безопасным способом. При создании файла отсутствуют условия гонки, если предположить, что платформа правильно реализует флаг os.O_EXCL для os.open() . Файл доступен для чтения и записи только создавшему ID пользователя. Если платформа использует биты разрешений для указания того, является ли файл исполняемым, то данный файл не может выполняться никем. Дескриптор файла не наследуется дочерними процессами.

В отличие от TemporaryFile() , пользователь mkstemp() несет ответственность за удаление временного файла по завершении работы с ним.

Если suffix не None , имя файла будет заканчиваться этим суффиксом, в противном случае суффикс не будет. mkstemp() не ставит точку между именем файла и суффиксом; если он вам нужен, поместить его в начало suffix.

Если prefix не None , имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию. По умолчанию возвращается значение gettempprefix() или gettempprefixb() , в зависимости от ситуации.

Если dir не None , файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, устанавливая переменные среды TMPDIR, TEMP или TMP. Таким образом, нет гарантии, что сгенерированное имя файла будет иметь какие-либо приятные свойства, такие как отсутствие необходимости заключать в кавычки при передаче внешним командам через os.popen() .

Если какие-либо из suffix, prefix и dir не являются None , они должны быть одного типа. Если это байты, возвращаемое имя будет bytes вместо str. Если вы хотите принудительно возвращать значение байтов с поведением по умолчанию, передайте suffix=b» .

Если указано значение text и установлено истинное значение, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.

mkstemp() возвращает кортеж, содержащий дескриптор уровня ОС для открытого файла (который будет возвращён os.open() ) и абсолютный путь к этому файлу в указанном порядке.

Вызывает событие аудита tempfile.mkstemp с аргументом fullpath .

Изменено в версии 3.5: suffix, prefix и dir теперь можно указывать в байтах, чтобы получить возвращаемое значение в байтах. До этого разрешалось использовать только str. suffix и prefix теперь принимают значение по умолчанию None , чтобы использовать соответствующее значение по умолчанию.

Изменено в версии 3.6: Параметр dir теперь принимает путеподобный объект .

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

Создаёт временный каталог максимально безопасным способом. При создании каталога нет условий гонки. Каталог доступен для чтения, записи и поиска только создавшему ID пользователя.

Пользователь mkdtemp() несет ответственность за удаление временного каталога и его содержимого по завершении работы с ним.

Аргументы prefix, suffix и dir такие же, как и для mkstemp() .

mkdtemp() возвращает абсолютный путь к новому каталогу.

Вызывает событие аудита tempfile.mkdtemp с аргументом fullpath .

Изменено в версии 3.5: suffix, prefix и dir теперь можно указывать в байтах, чтобы получить возвращаемое значение в байтах. До этого разрешалось использовать только str. suffix и prefix теперь принимают значение по умолчанию None , чтобы использовать соответствующее значение по умолчанию.

Изменено в версии 3.6: Параметр dir теперь принимает путеподобный объект .

tempfile. gettempdir ( )

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

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

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

Результат этого поиска кэшируется, см. описание tempdir ниже.

То же, что и gettempdir() , но возвращаемое значение находится в байтах.

Добавлено в версии 3.5.

tempfile. gettempprefix ( )

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

То же, что и gettempprefix() , но возвращаемое значение находится в байтах.

Добавлено в версии 3.5.

Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращенных gettempdir() . Его можно установить напрямую, чтобы переопределить процесс выбора, но это не рекомендуется. Все функции в этом модуле принимают аргумент dir, который можно использовать для указания каталога, и это рекомендуемый подход.

Если установлено значение, отличное от None , данная переменная определяет значение по умолчанию для аргумента dir для функций, определённых в этом модуле.

Если tempdir равен None (по умолчанию), то при любом вызове любой из вышеперечисленных функций, кроме gettempprefix() , он инициализируется по алгоритму, описанному в gettempdir() .

Примеры

Вот несколько примеров типичного использования модуля tempfile :

>>> import tempfile # создадим временный файл и запишем в него некоторые данные >>> fp = tempfile.TemporaryFile() >>> fp.write(b'Hello world!') # прочитаем данные из файла >>> fp.seek(0) >>> fp.read() b'Hello world!' # закроем файл, он будет удален >>> fp.close() # создадим временный файл, используя менеджер контекста >>> with tempfile.TemporaryFile() as fp: . fp.write(b'Hello world!') . fp.seek(0) . fp.read() b'Hello world!' >>> # файл закрыт и удален # создадим временный каталог с помощью менеджера контекста >>> with tempfile.TemporaryDirectory() as tmpdirname: . print('создал временный каталог', tmpdirname) >>> # каталог и содержимое были удалены 

Устаревшие функции и переменные

Исторический способ создания временных файлов заключался в том, чтобы сначала сгенерировать имя файла с помощью функции mktemp() , а затем создать файл с использованием этого имени. К сожалению, это небезопасно, т. к. другой процесс может создать файл с таким именем в промежутке времени между вызовом mktemp() и последующей попыткой создать файл первым процессом. Решение состоит в том, чтобы объединить два шага и немедленно создать файл. Данный подход используется mkstemp() и другими функциями, описанными выше.

tempfile. mktemp ( suffix=», prefix=’tmp’, dir=None )

Не рекомендуется, начиная с версии 2.3: Вместо этого используйте mkstemp() .

Возвращает абсолютный путь к файлу, не существовавший во время выполнения вызова. Аргументы prefix, suffix и dir аналогичны аргументам mkstemp() , за исключением того, что имена файлов в байтах, suffix=None и prefix=None не поддерживаются.

Использование данной функции может создать брешь в безопасности вашей программы. К тому времени, когда вы начнете что-то делать с именем файла, которое он возвращает, кто-то другой, возможно, опередит вас. Использование mktemp() можно легко заменить на NamedTemporaryFile() , передав ей параметр delete=False :

>>> f = NamedTemporaryFile(delete=False) >>> f.name '/tmp/tmptjujjt' >>> f.write(b"Hello World!\n") 13 >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) False 

Работа с временным файлом в Python 1 мин для чтения

Pimp My Ride встречает Алана Уэйка в новой игре на выживание в автомобиле

Favorite

Добавить в избранное

Python 3 - Обзор

Иногда нам нужно временно хранить данные в файле для временного выполнения какой-либо задачи. Например, ежемесячный отчет о продажах любой организации можно создать, сохранив данные о продажах во временном файле. Лучше сохранить данные во временном файле для создания отчета, чтобы предотвратить случайное изменение исходных данных. Временный файл также можно использовать для защиты конфиденциальных данных. Создание временного файла и выполнение таких задач легко выполняется в Python с помощью модуля tempfile . Этот модуль содержит множество функций для создания временных файлов и папок и легкого доступа к ним. В этой статье показано использование модуля tempfile в Python.

Создание временного файла без модуля tempfile

Задачу временного файла можно выполнить без использования модуля tempfile, создав простой файл. Для этого вы должны создать обычный файл, выполнить временные задачи и удалить файл после выполнения задач. В этом примере временный файл с именем temp.txt открывается в режиме записи, и во временный файл записывается текст. Модуль ‘ os ‘ используется здесь для чтения содержимого файла temp.txt и удаления файла после выполнения задачи.

# Импортировать модуль os
import os# Определить имя временного файла
filename = ‘temp.txt’

# Открыть файл в режиме чтения
fh = open(filename, ‘w’)
try:

# Распечатать сообщение перед записью
print(«Запись в файл >>> \n»)

# Записываем строку в файл
fh.write(«Тестирование временного файла»)

# Наконец, закроем файл после записи
fh.close()
finally:

# Напечатайте сообщение перед чтением
print(«

# Запустить команду bash, чтобы прочитать файл
os.system(«cat temp.txt»)

# Распечатать новую строку
print(«\n»)

# Удалить временный файл
os.remove(filename)

Создание временного файла с помощью метода TemporaryFile()

В этом примере для создания временного файла используется модуль tempfile. В этом модуле есть много методов работы с временным файлом. Метод TemporaryFile() используется здесь для создания временного файла. Временный файл открывается в сценарии как текстовый файл в режиме записи. По умолчанию временный файл будет создан в текущем месте. Две строки текста записываются во временный файл с помощью метода write(). Затем вызывается метод seek(), чтобы установить указатель файла в начало файла. Содержимое файла печатается в терминале с помощью метода read(). Метод close() модуля используется для закрытия файла и автоматического удаления файла.

# Импортировать модуль временного файла
import tempfile# Объявить объект для открытия временного файла для записи
tmp = tempfile.TemporaryFile(‘w + t’)
try:

Читать Как использовать функцию NumPy unique() в Python

# Распечатать сообщение перед записью
print(‘Запись во временный файл …’)

# Записать данные во временный файл
tmp.write(‘AndreyEx \n’)
tmp.write(‘Содержимое временного файла’)

# Перейти к началу файла
tmp.seek(0)

# Прочитать содержимое временного файла
print(‘ Чтение временного файла: \n ‘.format(tmp.read()))
finally:

# Автоматическое удаление временного файла
tmp.close()

Создание временного файла с использованием метода NamedTemporaryFile ()

В предыдущем примере имя временного файла создается случайным образом. Но если вы хотите установить любое собственное имя для временного файла, вы должны использовать метод NamedTemporaryFile() для создания временного файла. В этом примере временный файл открывается в режиме записи с помощью метода NamedTemporaryFile(). Далее устанавливается имя файла temp.txt. Одна строка текста записывается в файл и считывается из файла, как в предыдущем примере. Ранее упоминалось, что временный файл удаляется автоматически при вызове метода close(). После удаления здесь используется модуль ‘os’, чтобы проверить, существует ли временный файл.

# Импортировать модуль временного файла
import tempfile# Импортировать модуль os
import os

# Объявить объект для открытия временного файла для записи
tmp = tempfile.NamedTemporaryFile(‘w + t’)

# Объявить имя временного файла
tmp.name = «temp.txt»
try:

# Распечатать сообщение перед записью
print(‘Записать данные во временный файл …’)

# Записать данные во временный файл
tmp.write(‘Это временное содержимое.’)

# Перейти к началу файла
tmp.seek(0)

# Прочитать содержимое временного файла
print(‘Прочитать содержимое временного файла: \n ’ .format(tmp.read()))

finally:
# Удалить файл автоматически
tmp.close()

# Проверить, существует ли файл,
if (os.path.exists(tmp.name)) :
print(‘Файл существует’)
else:
print(‘Файл не существует’)

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

Все временные файлы создаются в текущем месте для предыдущих примеров. Местоположение временного файла, а также префикс и суффикс для временного файла можно указать во время создания файла с помощью метода NamedTemporaryFile(). Согласно следующему сценарию, временное имя файла будет начинаться с «tm_» и заканчиваться на «_fl». Файл будет сохранен в папке «/tmp». После создания файла временное имя файла печатается с использованием свойства name . Затем модуль ‘ os’ проверяет, удален файл или нет.

# Импортировать модуль временного файла
import tempfile# Импортировать модуль os
import os
Читать Превратить список в String в Python

# Объявить объект для создания временного файла с суффиксом и префиксом
tmp = tempfile.NamedTemporaryFile(mode = ‘w + t’, prefix = ‘tm_’, suffix = ‘_fl’, dir = ‘/tmp’)

# Распечатать временное имя файла
print(tmp.name)
try:

# Распечатать сообщение перед записью
print(‘Записать данные во временный файл …’)

# Записать данные во временный файл
tmp.write(‘Это временное содержимое.’)

finally:
# Автоматически удалить файл
tmp.close()
if (os.path.exists(tmp.name) == False) :
print(‘Файл удален’)

Заключение:

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Как создать временный файл в python

Текстовые метки: python, tempfile, temp, tmp, temporary, TemporaryFile, NamedTemporaryFile, SpooledTemporaryFile, TemporaryDirectory, mkstemp, mkdtemp

Раздел: Информационные технологии — Python — Основы языка

Запись: and-semakin/mytetra_data/master/base/15354433241hj0ebwdqi/text.html на raw.githubusercontent.com

В стандартной библиотеке Python есть модуль tempfile, который содержит классы и методы для корректной работы с временными файлами и директориями.

Сигнатура: tempfile.TemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None)

Эта функция создает временный файл в системной директории (разная в различных ОС) и возвращает файлоподобный объект (file-like object). Созданный временный файл будет автоматически удален по закрытию файла или при выходе из контекстного менеджера. Также другие процессы и приложения не смогут получить доступ к этому временному файлу.

import tempfile #1

print(«Creating one temporary file. «)

temp = tempfile.TemporaryFile() #2

print(«Created file is:», temp) #3

print(«Name of the file is:», temp.name) #4

print(«Closing the temp file»)

Creating one temporary file.

Created file is:

Name of the file is: 4

Closing the temp file

Сигнатура: tempfile.NamedTemporaryFile(mode=’w+b’, buffering=None, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True)

В прошлом примере было показано, что функция tempfile.TemporaryFile() возвращает файлоподобный объект без имени, но в Python есть и другая функция, которая позволяет создать именованный временный файл.

print(«Creating one named temporary file. «)

print(«Created file is:», temp)

print(«Name of the file is:», temp.name)

print(«Closing the temp file»)

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

Как мы видим, у созданного файла есть имя. Фишка в том, что мы можем сохранить имя временного файла и использовать после закрытия файла или завершения программы (для этого есть аргумент delete=False ).

Сигнатура: tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)

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

with tempfile.TemporaryDirectory() as tmpdirname:

print(‘Created temporary directory:’, tmpdirname)

# Both the directory and its contents have been deleted

Created temporary directory: /var/folders/l7/80bx27yx3hx_0_p1_qtjyyd40000gn/T/tmpn_ke7_rk

  • PEP8 — общепринятый стиль кода на языке Python
  • Асинхронное программирование в Python
  • Типизация (аннотация типов) в Python
  • Распространенные операции со словарями (dict) в Python
  • Управление аттрибутами объектов в Python
  • Распространенные операции со списками (list) в Python
  • Работа с временными файлами в Python
  • Распространенные операции над множествами (set) в Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *