Сообщить об ошибке.

Функция SpooledTemporaryFile() модуля tempfile в Python

Создать временный файл при превышении буфера

Синтаксис:

import tempfile

tempfile.SpooledTemporaryFile(max_size=0, mode='w+b', buffering=None, 
                              encoding=None, newline=None, suffix=None, 
                              prefix=None, dir=None, *, errors=None)

Параметры:

  • max_size=0 - максимальный объем буфера,
  • mode='w+b' - режим открытия файла,
  • buffering=None - буферизация,
  • encoding=None - кодировка для текстового режима,
  • newline=None - символ новой строки для текстового режима,
  • suffix=None - суффикс имени временного файла,
  • prefix=None - префикс имени временного файла,
  • dir=None - директория для создания файла,
  • errors=None - обработчик ошибок кодировки для текстового режима.

Возвращаемое значение:

Описание:

Функция SpooledTemporaryFile() модуля tempfile возвращает файлоподобный объект, который может использоваться в операторе with, как обычный файл.

Работает точно так же, как и tempfile.TemporaryFile(), за исключением того, что данные помещаются в буфер до тех пор, пока размер файла не превысит max_size или пока не будет вызван метод файла fileno(), после чего содержимое записывается на диск и работа продолжается как с tempfile.TemporaryFile().

Функция tempfile.SpooledTemporaryFile фактически использует 2 различных реализации файлового объекта - изначально это io.BytesIO() или io.TextIOWrapper в зависимости от того, был ли задан двоичный или текстовый режим, а когда объем io.Buffer() превышен max_size, то создает объект истинного файла через функцию tempfile.TeoraryFile().

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

Примеры:

Для временных файлов, содержащих относительно небольшие объемы данных, вероятно, будет более эффективно использовать функцию tempfile.SpooledTemporaryFile(), поскольку она хранит содержимое файла в памяти с помощью буфера io.BytesIO или io.StringIO, пока он не достигнут порогового размера. Когда объем данных превышает пороговое значение, он записывается на диск, а затем буфер заменяется обычным tempfile.TemporaryFile().

import tempfile

with tempfile.SpooledTemporaryFile(max_size=100,
                                   mode='w+t',
                                   encoding='utf-8') as tmp:

    for _ in range(8):
        tmp.write('Привет docs-python!\n')
        print(tmp._rolled, tmp._file)

# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# True <_io.TextIOWrapper name=3 mode='w+t' encoding='utf-8'>

Чтобы явно записать буфер на диск, вызовите методы SpooledTemporaryFile.rollover() или SpooledTemporaryFile.fileno().

import tempfile

with tempfile.SpooledTemporaryFile(max_size=100,
                                   mode='w+t',
                                   encoding='utf-8') as tmp:

    for i in range(5):
        tmp.write('Привет docs-python!\n')
        print(tmp._rolled, tmp._file)
    print('Rolling over')
    temp.rollover()

# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
# False <_io.StringIO object at 0x7f2018cb4948>
Rolling over
# True <_io.TextIOWrapper name=3 mode='w+t' encoding='utf-8'>