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 argument 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 атрибут которого является базовым объектом true file. Этот файлообразный объект можно используемый в with инструкция, как и обычный файл.

Raises an auditing event tempfile.mkstemp with argument 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), либо объектом 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 argument fullpath.

Добавлено в версии 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 argument 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() возвращает абсолютное имя пути нового каталога.

Raises an auditing event tempfile.mkdtemp with argument fullpath.

Изменено в версии 3.5: suffix, prefix и dir теперь могут подаваться в байтах для получения байтов возвращает значение. До этого разрешалась только стр. suffix и prefix теперь принять и по умолчанию None, чтобы вызвать значение соответствующего используемый по умолчанию.

Изменено в версии 3.6: Теперь параметр dir принимает путеподобный объект.

tempfile.gettempdir()

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

Python ищет стандартный список каталогов для поиска каталога, в котором вызывающий пользователь может создавать файлы. Список:

  1. Каталог, именованный переменной среды TMPDIR.
  2. Каталог, именованный переменной среды TEMP.
  3. Каталог, именованный переменной среды TMP.
  4. Местоположение для конкретной платформы:
    • В Windows каталоги C:\TEMP, C:\TMP, \TEMP и \TMP в таком порядке.
    • На всех остальных платформах каталоги /tmp, /var/tmp и /usr/tmp в таком порядке.
  5. В крайнем случае, текущий рабочий каталог.

Результат этого поиска кэшируется, см. описание 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