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 или новее).Возникает событие аудита
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 равно True (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является объектом, подобным файлу, чьё свойство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: Метод truncate теперь принимает аргумент
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(). Файл доступен только для чтения и записи пользователем, создавшим файл. Если платформа использует биты разрешений для указания возможности выполнения файла, то файл не может быть выполнен никем. Дескриптор файла не наследуется дочерними процессами.В отличие от
TemporaryFile(), пользователь функцииmkstemp()отвечает за удаление временного файла после завершения работы с ним.Если суффикс не
None, имя файла будет заканчиваться этим суффиксом, в противном случае суффикса не будет. Функцияmkstemp()не ставит точку между именем файла и суффиксом; если вам нужна точка, поместите её в начале суффикса.Если префикс не
None, имя файла будет начинаться с этого префикса; в противном случае используется стандартный префикс. Стандартный префикс — это результат вызоваgettempprefix()илиgettempprefixb(), в зависимости от типа.Если каталог не
None, файл будет создан в этом каталоге; в противном случае используется стандартный каталог. Стандартный каталог выбирается из платформозависимого списка, но пользователь приложения может контролировать расположение каталога, установив переменные окружения TMPDIR, TEMP или TMP. Таким образом, нет гарантии, что сгенерированное имя файла будет иметь хорошие свойства, такие как отсутствие необходимости в экранировании при передаче внешним командам черезos.popen().Если любые из суффикс, префикс и каталог не
None, они должны быть одного типа. Если это байты, возвращаемое имя будет байтами, а не строкой. Если вы хотите принудительно получить значение в байтах с другими стандартными настройками, передайтеsuffix=b''.Если указан текст и значение true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.
mkstemp()возвращает кортеж, содержащий дескриптор файла на уровне операционной системы (как возвращаетos.open()) и абсолютный путь к этому файлу в указанном порядке.Вызывает событие аудита
tempfile.mkstempс аргументомfullpath.Изменено в версии 3.5: суффикс, префикс и каталог теперь могут быть предоставлены в байтах, для получения значения в байтах. Ранее разрешалась только строка. суффикс и префикс теперь принимают и используют значения по умолчанию
Noneдля использования соответствующих значений по умолчанию.Изменено в версии 3.6: Параметр каталог теперь принимает объект, подобный пути.
-
tempfile.mkdtemp(suffix=None, prefix=None, dir=None) -
Создает временную директорию наиболее безопасным способом. Нет проблем с одновременным созданием директории. Директория доступна только для чтения, записи и поиска пользователем, создавшим директорию.
Пользователь функции
mkdtemp()отвечает за удаление временной директории и её содержимого после завершения работы с ней.Аргументы префикс, суффикс и каталог такие же, как у
mkstemp().mkdtemp()возвращает абсолютный путь к новой директории.Вызывает событие аудита
tempfile.mkdtempс аргументомfullpath.Изменено в версии 3.5: суффикс, префикс и каталог теперь могут быть предоставлены в байтах, для получения значения в байтах. Ранее разрешалась только строка. суффикс и префикс теперь принимают и используют значения по умолчанию
Noneдля использования соответствующих значений по умолчанию.Изменено в версии 3.6: Параметр каталог теперь принимает объект, подобный пути.
-
tempfile.gettempdir() -
Возвращает имя каталога, используемого для временных файлов. Это определяет значение по умолчанию для аргумента каталог всех функций в этом модуле.
Python ищет в стандартном списке каталогов тот, в котором вызывающий пользователь может создавать файлы. Список:
- Каталог, указанный в переменной окружения
TMPDIR. - Каталог, указанный в переменной окружения
TEMP. - Каталог, указанный в переменной окружения
TMP. -
Платформозависимое расположение:
- В Windows — каталоги
C:\TEMP,C:\TMP,\TEMP, и\TMP, в указанном порядке. - На всех других платформах — каталоги
/tmp,/var/tmp, и/usr/tmp, в указанном порядке.
- В Windows — каталоги
- В качестве последнего средства — текущая рабочая директория.
Результат этого поиска кэшируется, см. описание
tempdirниже. - Каталог, указанный в переменной окружения
-
tempfile.gettempdirb() -
То же, что и
gettempdir(), но возвращаемое значение — в байтах.Новое в версии 3.5.
-
tempfile.gettempprefix() -
Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонент каталога.
-
tempfile.gettempprefixb() -
То же, что и
gettempprefix(), но возвращаемое значение — в байтах.Новое в версии 3.5.
Модуль использует глобальную переменную для хранения имени каталога, используемого для временных файлов, возвращаемого функцией gettempdir(). Её можно напрямую установить, чтобы переопределить процесс выбора, но это не рекомендуется. Все функции в этом модуле принимают аргумент каталог, который можно использовать для указания каталога, и это рекомендуемый подход.
-
tempfile.tempdir -
При установке в значение, отличное от
None, эта переменная определяет значение по умолчанию для аргумента каталог функций в этом модуле.Если
tempdirимеет значениеNone(по умолчанию) при любом вызове любой из вышеперечисленных функций, за исключениемgettempprefix(), она инициализируется в соответствии с алгоритмом, описанным вgettempdir().
Примеры
Вот несколько примеров типичного использования модуля 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 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()вместо этого.Возвращает абсолютный путь к файлу, который не существовал на момент вызова. Аргументы префикс, суффикс и каталог аналогичны аргументам
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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/tempfile.html