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 или более поздней версии).Raises an auditing event
tempfile.mkstemp
with argumentfullpath
.Изменено в версии 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
атрибут которого является базовым объектом true file. Этот файлообразный объект можно используемый вwith
инструкция, как и обычный файл.Raises an auditing event
tempfile.mkstemp
with argumentfullpath
.Изменено в версии 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), либо объектом true, в зависимости от того, был ли вызванrollover()
. Этот файлообразный объект можно используемый вwith
инструкция, как и обычный файл.Изменено в версии 3.3: метод усечения теперь принимает аргумент
size
.Изменено в версии 3.8: Добавлен errors параметр.
-
tempfile.
TemporaryDirectory
(suffix=None, prefix=None, dir=None)¶ Функция надежно создает временный каталог, используя те же правила, что и
mkdtemp()
. Полученный объект можно используемый в качестве менеджера контекст (см. Примеры). По завершении контекст или уничтожения объекта временного каталога вновь созданный временный каталог и все его содержимое удаляются из файловой системы.Имя каталога можно получить из
name
атрибут объекта возвращенный. Когда объект возвращенный будет используемый как менеджером контекст,name
будет назначен на цельas
клаузула вwith
инструкция, если будет тот.Каталог можно явно очистить, вызвав метод
cleanup()
.Raises an auditing event
tempfile.mkdtemp
with argumentfullpath
.Добавлено в версии 3.2.
-
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 и true, файл открывается в текстовом режиме. В противном случае (по умолчанию) файл открывается в двоичном режиме.
mkstemp()
возвращает кортеж, содержащий дескриптор уровня ОС, в открытый файл (как будет возвращенныйos.open()
) и абсолютное имя пути этого файла в таком порядке.Raises an auditing event
tempfile.mkstemp
with argumentfullpath
.Изменено в версии 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()
возвращает абсолютное имя пути нового каталога.Raises an auditing event
tempfile.mkdtemp
with argumentfullpath
.Изменено в версии 3.5: suffix, prefix и dir теперь могут подаваться в байтах для получения байтов возвращает значение. До этого разрешалась только стр. suffix и prefix теперь принять и по умолчанию
None
, чтобы вызвать значение соответствующего используемый по умолчанию.Изменено в версии 3.6: Теперь параметр dir принимает путеподобный объект.
-
tempfile.
gettempdir
()¶ Возвращает имя каталога, используемый для временных файлов. Это определяет значение по умолчанию для аргумента dir для всех функций в этом модуле.
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()
. Он может быть установлен
непосредственно для переопределения процесса выбора, но это не рекомендуется.
Все функции в этом модуле имеют dir аргумент, который можно используемый
для указания каталога, и это рекомендуемый подход.
-
tempfile.
tempdir
¶ Если задано значение значение, отличное от
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('created temporary directory', 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