tempfile — Генерация временных файлов и каталогов
Исходный код: Lib/tempfile.py
Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах. 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 или более поздней версии).На платформах, которые не являются ни Posix, ни Cygwin, TemporaryFile является псевдонимом для NamedTemporaryFile.
Возбуждает событие аудита аудита
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, delete_on_close=True) -
Эта функция работает точно так же, как и
TemporaryFile(), за исключением следующих отличий:- Эта функция возвращает файл, который гарантированно имеет видимое имя в файловой системе.
- Для управления именованным файлом она расширяет параметры
TemporaryFile()параметрами delete и delete_on_close, которые определяют, нужно ли и как автоматически удалять именованный файл.
Возвращаемый объект всегда является объектом, подобным файлу, чей атрибут
fileявляется базовым истинным объектом файла. Этот объект, подобный файлу, может использоваться в инструкцииwith, как и обычный файл. Имя временного файла можно получить из атрибутаnameвозвращённого объекта, подобного файлу. В Unix, в отличие отTemporaryFile(), запись о файле в каталоге не разрывается сразу после создания файла.Если delete равно true (по умолчанию) и delete_on_close равно true (по умолчанию), файл удаляется как только он закрывается. Если delete равно true и delete_on_close равно false, файл удаляется только при выходе из менеджера контекста или при завершении работы объекта подобного файлу. Удаление не всегда гарантировано в этом случае (см.
object.__del__()). Если delete равно false, значение delete_on_close игнорируется.Поэтому, чтобы использовать имя временного файла для повторного открытия файла после его закрытия, нужно либо убедиться, что файл не удаляется при закрытии (установить параметр delete в false), либо, если временный файл создан в инструкции
with, установить параметр delete_on_close в false. Последний подход рекомендуется, так как он помогает в автоматической очистке временного файла при выходе из менеджера контекста.Повторное открытие временного файла по имени, пока он всё ещё открыт, происходит следующим образом:
- В POSIX файл всегда можно открыть повторно.
-
В Windows, убедитесь, что выполнено хотя бы одно из следующих условий:
- delete равно false
- дополнительные открытые операции с правами на удаление (например, вызов
os.open()с флагомO_TEMPORARY) -
delete равно true, но delete_on_close равно false. Заметьте, что в этом случае дополнительные открытые операции, не делящие права на удаление (например, созданные с помощью встроенной функции
open()) должны быть закрыты перед выходом из менеджера контекста, иначе вызовos.unlink()при выходе из менеджера контекста завершится ошибкойPermissionError.
В Windows, если delete_on_close равно false, и файл создан в каталоге, для которого у пользователя нет прав на удаление, вызов
os.unlink()при выходе из менеджера контекста завершится ошибкойPermissionError. Это не может произойти, когда delete_on_close равно true, потому что права на удаление запрашиваются при открытии, которое сразу же завершается ошибкой, если запрашиваемые права не предоставлены.В POSIX (только), процесс, прерванный внезапно сигналом SIGKILL, не может автоматически удалить созданные NamedTemporaryFiles.
Возбуждает событие аудита аудита
tempfile.mkstempс аргументомfullpath.Изменено в версии 3.8: Добавлен параметр errors.
Изменено в версии 3.12: Добавлен параметр delete_on_close.
-
class 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() -
Полученный файл имеет один дополнительный метод,
rollover(), который вызывает перенос файла на диск независимо от его размера.
Возвращаемый объект — это объект, подобный файлу, чьё атрибут
_file— это объектio.BytesIOилиio.TextIOWrapper(в зависимости от того, был ли указан двоичный или текстовый режим mode) или настоящий объект файла, в зависимости от того, был ли вызванrollover(). Этот похожий на файл объект может использоваться в оператореwith, как и обычный файл.Изменено в версии 3.3: Метод truncate теперь принимает аргумент size.
Изменено в версии 3.8: Добавлен параметр errors.
Изменено в версии 3.11: Полностью реализует абстрактные базовые классы
io.BufferedIOBaseиio.TextIOBase(в зависимости от того, был ли указан двоичный или текстовый режим mode). -
-
class tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False, *, delete=True) -
Этот класс безопасно создаёт временную директорию, используя те же правила, что и
mkdtemp(). Возвращаемый объект может использоваться как менеджер контекста (см. Примеры). По завершении контекста или уничтожении объекта временной директории, новая временная директория и всё её содержимое удаляются из файловой системы.-
name -
Имя директории можно получить из атрибута
nameвозвращённого объекта. Когда возвращаемый объект используется как менеджер контекста,nameбудет назначено цели блокаasв оператореwith, если таковой имеется.
-
cleanup() -
Директорию можно явно очистить, вызвав метод
cleanup(). Если ignore_cleanup_errors равно true, любые необработанные исключения во время явного или неявного очищения (например,PermissionErrorпри удалении открытых файлов в Windows) будут проигнорированы, а оставшиеся удаляемые элементы будут удалены на основе принципа «лучшее из возможного». В противном случае, ошибки будут подняты в контексте, в котором происходит очищение (вызовcleanup(), выход из менеджера контекста, при сборе мусора объекта или при завершении интерпретатора).
Параметр delete может использоваться для отключения очистки дерева директорий при выходе из контекста. Хотя может показаться необычным для менеджера контекста отключать действие, выполняемое при выходе из контекста, это может быть полезно во время отладки или когда нужно, чтобы поведение очищения зависело от другой логики.
Вызывает событие аудита
tempfile.mkdtempс аргументомfullpath.Добавлена в версии 3.2.
Изменено в версии 3.10: Добавлен параметр ignore_cleanup_errors.
Изменено в версии 3.12: Добавлен параметр delete.
-
-
tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False) -
Создаёт временный файл максимально безопасным способом. Не существует проблем с гонками при создании файла, если платформа корректно реализует флаг
os.O_EXCLдляos.open(). Файл доступен для чтения и записи только для пользователя, создавшего его. Если платформа использует биты разрешений для указания, является ли файл исполняемым, то файл не исполняем никем. Дескриптор файла не наследуется дочерними процессами.В отличие от
TemporaryFile(), пользователь, использующийmkstemp(), отвечает за удаление временного файла по окончании работы с ним.Если suffix не
None, имя файла будет заканчиваться этим суффиксом, иначе суффикса не будет.mkstemp()не вставляет точку между именем файла и суффиксом; если вам нужна точка, поместите её в начало suffix.Если prefix не
None, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию. По умолчанию используется значение, возвращённоеgettempprefix()илиgettempprefixb(), соответственно.Если dir не
None, файл будет создан в этой директории; в противном случае используется директория по умолчанию. Директория по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может контролировать расположение директории, установив переменные окружения TMPDIR, TEMP или TMP. Таким образом, нет гарантии, что сгенерированное имя файла будет иметь какие-либо хорошие свойства, такие как необходимость экранирования при передаче во внешние команды черезos.popen().Если suffix, prefix и dir не
None, они должны быть одного типа. Если они являются байтами, возвращаемое имя будет байтами, а не строкой. Если вы хотите принудительно получить значение байтов с поведением по умолчанию, передайтеsuffix=b''.Если text указано и истинно, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.
mkstemp()возвращает кортеж, содержащий дескриптор файла на уровне ОС (как возвращаетos.open()) и абсолютный путь к этому файлу в указанном порядке.Вызывает событие аудита
tempfile.mkstempс аргументомfullpath.Изменено в версии 3.5: suffix, prefix и dir теперь могут быть переданы в виде байтов для получения значения возвращаемого имени в виде байтов. Ранее допускалась только строка. suffix и prefix теперь принимают значение по умолчанию
Noneдля использования соответствующего значения по умолчанию.Изменено в версии 3.6: Параметр dir теперь принимает объект пути.
-
tempfile.mkdtemp(suffix=None, prefix=None, dir=None) -
Создаёт временную директорию максимально безопасным способом. Не существует проблем с гонками при создании директории. Директория доступна для чтения, записи и поиска только для пользователя, создавшего её.
Пользователь, использующий
mkdtemp(), отвечает за удаление временной директории и её содержимого по окончании работы.Аргументы prefix, suffix и dir такие же, как и для
mkstemp().mkdtemp()возвращает абсолютный путь к новой директории.Вызывает событие аудита
tempfile.mkdtempс аргументомfullpath.Изменено в версии 3.5: suffix, prefix и dir теперь могут быть переданы в виде байтов для получения значения возвращаемого имени в виде байтов. Ранее допускалась только строка. suffix и prefix теперь принимают значение по умолчанию
Noneдля использования соответствующего значения по умолчанию.Изменено в версии 3.6: Параметр dir теперь принимает объект пути.
Изменено в версии 3.12:
mkdtemp()теперь всегда возвращает абсолютный путь, даже если dir является относительным.
-
tempfile.gettempdir() -
Возвращает имя каталога, используемого для временных файлов. Это определяет значение по умолчанию для аргумента dir всех функций в этом модуле.
Python ищет в стандартном списке каталогов тот, в котором вызывающий пользователь может создавать файлы. Список:
- Каталог, указанный переменной среды
TMPDIR. - Каталог, указанный переменной среды
TEMP. - Каталог, указанный переменной среды
TMP. -
Платформенно-зависимое расположение:
- В Windows — каталоги
C:\TEMP,C:\TMP,\TEMP, и\TMP, в указанном порядке. - На всех остальных платформах — каталоги
/tmp,/var/tmp, и/usr/tmp, в указанном порядке.
- В Windows — каталоги
- В качестве последнего средства — текущий рабочий каталог.
Результат этого поиска кэшируется, см. описание
tempdirниже.Изменено в версии 3.10: Всегда возвращает str. Ранее он мог возвращать любое значение
tempdir, независимо от типа, пока оно не былоNone. - Каталог, указанный переменной среды
-
tempfile.gettempdirb() -
То же, что и
gettempdir(), но возвращаемое значение — в байтах.Добавлен в версии 3.5.
-
tempfile.gettempprefix() -
Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонент каталога.
-
tempfile.gettempprefixb() -
То же, что и
gettempprefix(), но возвращаемое значение — в байтах.Добавлен в версии 3.5.
Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращаемого gettempdir(). Можно напрямую установить его для переопределения процесса выбора, но это не рекомендуется. Все функции в этом модуле принимают аргумент dir, который можно использовать для указания каталога. Это рекомендуемый подход, который не вызывает неожиданного изменения поведения глобального API для других кодов.
-
tempfile.tempdir -
При установке в значение, отличное от
None, эта переменная определяет значение по умолчанию для аргумента dir функций, определённых в этом модуле, включая его тип, bytes или str. Она не может быть объектом пути.Если
tempdirравноNone(по умолчанию) при любом вызове любой из вышеперечисленных функций, кромеgettempprefix(), она инициализируется в соответствии с алгоритмом, описанным вgettempdir().Примечание
Обратите внимание, что если вы устанавливаете
tempdirв значение типа bytes, возникает неприятный побочный эффект: глобальный тип возвращаемого значения по умолчанию дляmkstemp()иmkdtemp()изменяется на bytes, если не указаны явные аргументыprefix,suffix, илиdirтипа str. Пожалуйста, не пишите код, ожидающий или зависящий от этого. Это неудобное поведение сохраняется для совместимости с исторической реализацией.
Примеры
Ниже приведены примеры типичного использования модуля tempfile:
>>> import tempfile
# create a temporary file and write some data to it
>>> fp = tempfile.TemporaryFile()
>>> fp.write(b'Hello world!')
# read data from file
>>> fp.seek(0)
>>> fp.read()
b'Hello world!'
# close the file, it will be removed
>>> fp.close()
# create a temporary file using a context manager
>>> with tempfile.TemporaryFile() as fp:
... fp.write(b'Hello world!')
... fp.seek(0)
... fp.read()
b'Hello world!'
>>>
# file is now closed and removed
# create a temporary file using a context manager
# close the file, use the name to open the file again
>>> with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
... fp.write(b'Hello world!')
... fp.close()
... # the file is closed, but not removed
... # open the file again by using its name
... with open(fp.name, mode='rb') as f:
... f.read()
b'Hello world!'
>>>
# file is now removed
# create a temporary directory using the context manager
>>> with tempfile.TemporaryDirectory() as tmpdirname:
... print('created temporary directory', tmpdirname)
>>>
# directory and contents have been removed
Устаревшие функции и переменные
Исторический способ создания временных файлов заключался в предварительном генерировании имени файла с помощью функции 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
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/tempfile.html