В документации метода IOBase.truncate
говорится, что:
обрезать (размер = нет)
Измените размер потока до заданного размера в байтах (или текущей позиции, если размер не указан). Текущая позиция потока не изменяется. Это изменение размера может увеличить или уменьшить текущий размер файла. В случае расширения содержимое новой файловой области зависит от платформы (в большинстве систем дополнительные байты заполняются нулями). Возвращается новый размер файла.
Изменено в версии 3.5: Windows теперь будет заполнять файлы нулями при расширении.
Итак, принимая это во внимание, я предполагаю, что BytesIO
(это подкласс BufferedIOBase
, который, в свою очередь, является подклассом IOBase
) изменяет размер своего внутреннего буфера после вызова этого метода.
Но следующий фрагмент кода показывает, что я ошибаюсь в своих предположениях:
from io import BytesIO
# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
data = BytesIO(8 * b"\x00")
print(data.getvalue())
# prints 16
print(data.truncate(16))
# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
print(data.getvalue())
# prints b'\x00\x00\x00\x00\x00\x00\x00\x00'
print(bytes(data.getbuffer()))
Где я свернул не туда?