На этом шаге мы рассмотрим, как это можно реализовать.
Вы хотите записать "сырые" байты в файл, открытый в текстовом режиме.
Просто запишите байтовые данные в buffer. Например:
>>> import sys >>> sys.stdout.write(b'Hello\n') Traceback (most recent call last): . . . . TypeError: must be str, not bytes >>> sys.stdout.buffer.write(b'Hello\n') Hello 5 >>>
Похожим образом бинарные данные могут быть прочитаны из текстового файла путем чтения из атрибута buffer.
Выполнение последней строки может вызвать появление следующей ошибки:
Traceback (most recent call last):
. . . .
AttributeError: 'StdOutputFile' object has no attribute 'buffer'
Чтобы исправить:
Система ввода-вывода построена на слоях. Текстовые файлы конструируются путем добавления слоя кодирования/декодирования в Unicode поверх буферизованного файла, открытого в бинарном режиме. Атрибут buffer просто ссылается на этот файл. Если вы обращаетесь к нему, то обходите слой текстового кодирования/декодирования.
Пример с sys.stdout может быть рассмотрен как особый случай. По умолчанию sys.stdout всегда открывается в текстовом режиме. Однако если вы пишете скрипт, которому на самом деле нужно сбрасывать бинарные данные в стандартный вывод, то можете использовать показанный прием для обхода текстовой кодировки.
На следующем шаге мы рассмотрим оборачивание существующего дескриптора файла для использования в качестве объекта файла.