Документация Python неофициальный перевод

10.6. tempfile – Генерация временных файлов и каталоговtempfile – Generate temporary files and directories

Исходный код: Lib/tempfile.py


Этот модуль создаёт временные файлы и каталоги. Он работает на всех поддерживаемых платформах.

В версии Python 2.3 этот модуль был переработан для повышения безопасности. Теперь он предоставляет три новые функции: NamedTemporaryFile(), mkstemp() и mkdtemp(), которые должны устранить все оставшиеся причины использовать небезопасную функцию mktemp(). Имена временных файлов, создаваемых этим модулем, больше не содержат идентификатор процесса; вместо этого используется строка из шести случайных символов.

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

Модуль определяет следующие функции, которые могут вызываться пользователем:

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

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

Параметр mode по умолчанию равен 'w+b', чтобы созданный файл можно было читать и записывать без закрытия. Используется двоичный режим, чтобы он работал одинаково на всех платформах независимо от хранящихся данных. bufsize по умолчанию равен -1, то есть используются настройки операционной системы.

Параметры dir, prefix и suffix передаются в mkstemp().

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

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

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

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

Новое в версии 2.3.

Новое в версии 2.6: Параметр delete.

tempfile.SpooledTemporaryFile([max_size=0[, mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]]])

Эта функция работает точно так же, как TemporaryFile(), за исключением того, что данные буферизуются в памяти, пока размер файла не превысит max_size или не будет вызван метод fileno() файла. В этот момент содержимое записывается на диск, и работа продолжается как с TemporaryFile(). Кроме того, метод truncate не принимает аргумент size.

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

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

Новое в версии 2.6.

tempfile.mkstemp([suffix=''[, prefix='tmp'[, dir=None[, text=False]]]])

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

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

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

Если указан prefix, имя файла будет начинаться с этого префикса; в противном случае используется префикс по умолчанию.

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

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

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

Новое в версии 2.3.

tempfile.mkdtemp([suffix=''[, prefix='tmp'[, dir=None]]])

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

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

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

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

Новое в версии 2.3.

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 в первый каталог, в котором вызывающий пользователь может создавать файлы. Список:

  1. Каталог, заданный переменной окружения TMPDIR.

  2. Каталог, заданный переменной окружения TEMP.

  3. Каталог, заданный переменной окружения TMP.

  4. Расположение, зависящее от платформы:

    • На RiscOS – каталог, заданный переменной окружения Wimp$ScrapDir.

    • В Windows – каталоги C:\TEMP, C:\TMP, \TEMP и \TMP в указанном порядке.

    • На всех остальных платформах – каталоги /tmp, /var/tmp и /usr/tmp в указанном порядке.

  5. В крайнем случае – текущий рабочий каталог.

tempfile.gettempdir()

Возвращает каталог, выбранный в данный момент для создания временных файлов. Если tempdir не равно None, просто возвращает его содержимое; в противном случае выполняется описанный выше поиск и возвращается результат.

Новое в версии 2.3.

tempfile.template

Устарело с версии 2.0: Вместо этого используйте gettempprefix().

Если задано значение, отличное от None, эта переменная определяет префикс конечного компонента имён файлов, возвращаемых mktemp(). Для обеспечения уникальности к префиксу добавляется строка из шести случайных букв и цифр. Префикс по умолчанию – tmp.

В старых версиях этого модуля требовалось устанавливать template в None после вызова os.fork(); начиная с версии 1.5.2 это не требуется.

tempfile.gettempprefix()

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

Новое в версии 1.5.2.