10.5. tempfile – Создание временных файлов и каталогов¶tempfile – Generate temporary files and directories
Этот модуль генерирует временные файлы и каталоги. Он работает на всех поддерживаемых платформах. В нем появились три новые функции: NamedTemporaryFile(), mkstemp() и mkdtemp(), которые должны полностью устранить необходимость в небезопасной функции mktemp(). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.
Кроме того, все вызываемые пользователем функции теперь принимают дополнительные аргументы, позволяющие напрямую управлять расположением и именем временных файлов. Больше нет необходимости использовать глобальные переменные tempdir и template. Для сохранения обратной совместимости порядок аргументов несколько необычен; рекомендуется использовать именованные аргументы для ясности.
Модуль определяет следующие функции, которые могут вызываться пользователем:
- tempfile.TemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None)¶
Return a file-like object that can be used as a temporary storage area. The file is created using mkstemp(). It will be destroyed as soon as it is closed (including an implicit close when the object is garbage collected). Under Unix, the directory entry for the file is removed immediately after the file is created. Other platforms do not support this; your code should not rely on a temporary file created using this function having or not having a visible name in the file system.
Параметр mode по умолчанию равен 'w+b', чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он вел себя одинаково на всех платформах независимо от хранящихся данных. buffering, encoding и newline интерпретируются так же, как для open().
Параметры dir, prefix и suffix передаются в mkstemp().
Возвращаемый объект является настоящим файловым объектом на платформах POSIX. На других платформах это объект, подобный файлу, атрибут file которого является базовым настоящим файловым объектом. Этот объект, подобный файлу, можно использовать в операторе with, как обычный файл.
- tempfile.NamedTemporaryFile(mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None, delete=True)¶
- Эта функция работает точно так же, как TemporaryFile(), за исключением того, что файл гарантированно имеет видимое имя в файловой системе (в Unix запись в каталоге не удаляется). Это имя можно получить из атрибута name объекта файла. Возможность использовать это имя для повторного открытия файла, пока временный файл ещё открыт, зависит от платформы (в Unix это возможно, в Windows NT и новее – нет). Если delete равно true (по умолчанию), файл удаляется сразу после закрытия. Возвращаемый объект всегда является файлоподобным объектом, атрибут file которого представляет собой настоящий файловый объект. Этот файлоподобный объект можно использовать в инструкции with, как обычный файл.
- tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, encoding=None, newline=None, suffix='', prefix='tmp', dir=None)¶
Эта функция работает точно так же, как TemporaryFile(), за исключением того, что данные сохраняются в памяти, пока размер файла не превысит max_size или пока не будет вызван метод fileno() файла; после этого содержимое записывается на диск, и работа продолжается как с TemporaryFile().
Полученный файл имеет один дополнительный метод, rollover(), который вызывает переход файла на дисковый файл независимо от его размера.
Возвращаемый объект является файлоподобным объектом, атрибут _file которого может быть либо объектом StringIO, либо настоящим файловым объектом, в зависимости от того, была ли вызвана rollover(). Этот файлоподобный объект можно использовать в инструкции with, как обычный файл.
- tempfile.mkstemp(suffix='', prefix='tmp', dir=None, text=False)¶
Создает временный файл максимально безопасным способом. При создании файла не возникает состояний гонки, если платформа правильно реализует флаг os.O_EXCL для os.open(). Файл доступен для чтения и записи только создавшему его пользователю (UID). Если платформа использует биты разрешений для указания исполняемости файла, файл неисполним никем. Файловый дескриптор не наследуется дочерними процессами.
В отличие от TemporaryFile(), пользователь mkstemp() отвечает за удаление временного файла после завершения работы с ним.
Если указан suffix, имя файла будет заканчиваться этим суффиксом, в противном случае суффикса не будет. mkstemp() не ставит точку между именем файла и суффиксом; если она нужна, поместите её в начало suffix.
Если указан prefix, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.
Если указан dir, файл будет создан в этом каталоге; в противном случае используется каталог по умолчанию. Каталог по умолчанию выбирается из списка, зависящего от платформы, но пользователь приложения может управлять расположением каталога, задав переменные окружения TMPDIR, TEMP или TMP. Таким образом, нет гарантии, что сгенерированное имя файла будет обладать какими-либо удобными свойствами, например, не требовать экранирования при передаче внешним командам через os.popen().
Если указан параметр text, он определяет, открывать файл в двоичном режиме (по умолчанию) или в текстовом. На некоторых платформах это не имеет значения.
mkstemp() возвращает кортеж, содержащий дескриптор открытого файла на уровне ОС (как бы вернул os.open()) и абсолютный путь к этому файлу, в указанном порядке.
- tempfile.mkdtemp(suffix='', prefix='tmp', dir=None)¶
Создаёт временный каталог максимально безопасным способом. В создании каталога нет состояний гонки. Каталог доступен для чтения, записи и поиска только создавшему его пользователю.
Пользователь mkdtemp() отвечает за удаление временного каталога и его содержимого после завершения работы.
Аргументы prefix, suffix и dir такие же, как для mkstemp().
mkdtemp() возвращает абсолютный путь к новому каталогу.
- tempfile.mktemp(suffix='', prefix='tmp', dir=None)¶
Устарело с версии 2.3: Вместо этого используйте mkstemp().
Возвращает абсолютный путь к файлу, которого не существовало на момент вызова. Аргументы prefix, suffix и dir такие же, как у mkstemp().
Предупреждение
Использование этой функции может привести к появлению уязвимости в вашей программе. К тому моменту, как вы соберетесь что-то делать с возвращённым именем файла, кто-то другой может вас опередить. Использование mktemp() можно легко заменить на NamedTemporaryFile(), передав ей параметр delete=False:
>>> f = NamedTemporaryFile(delete=False) >>> f <open file '<fdopen>', mode 'w+b' at 0x384698> >>> f.name '/var/folders/5q/5qTPn6xq2RaWqk+1Ytw3-U+++TI/-Tmp-/tmpG7V1Y0' >>> f.write("Hello World!\n") >>> f.close() >>> os.unlink(f.name) >>> os.path.exists(f.name) False
Модуль использует две глобальные переменные, которые указывают, как формировать временное имя. Они инициализируются при первом вызове любой из перечисленных выше функций. Вызывающий может изменить их, но это не рекомендуется; вместо этого используйте соответствующие аргументы функций.
- tempfile.tempdir¶
Если этой переменной присвоено значение, отличное от None, она определяет значение по умолчанию для аргумента dir всех функций, определённых в этом модуле.
Если tempdir не задан или равен None при любом вызове любой из перечисленных выше функций, Python просматривает стандартный список каталогов и устанавливает tempdir равным первому каталогу, в котором вызвавший пользователь может создавать файлы. Список:
- Каталог, указанный переменной окружения TMPDIR.
- Каталог, указанный переменной окружения TEMP.
- Каталог, указанный переменной окружения TMP.
- Расположение, зависящее от платформы:
- На Windows каталоги C:\TEMP, C:\TMP, \TEMP и \TMP, в указанном порядке.
- На всех остальных платформах каталоги /tmp, /var/tmp и /usr/tmp, в указанном порядке.
- В крайнем случае – текущий рабочий каталог.
- tempfile.gettempdir()¶
- Возвращает каталог, выбранный в данный момент для создания временных файлов. Если tempdir не равно None, эта функция просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.
- tempfile.gettempprefix()¶
- Возвращает префикс имени файла, используемый для создания временных файлов. Он не содержит компонента каталога.