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'>