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

Потоковое кодирование и декодирование в Python

Классы codecs.StreamWriter() и codecs.StreamReader() предоставляют общие рабочие интерфейсы, которые могут быть использованы для реализации новых подмодулей кодирования очень легко.

Содержание:


Объект StreamWriter.

Класс StreamWriter является подклассом базового класса Codec и определяет следующие методы, которые должен определить каждый потоковый writer, чтобы быть совместимым с реестром кодека Python.

codecs.StreamWriter(stream, errors='strict'):

Класс codecs.StreamWriter() определяет конструктор для экземпляра StreamWriter. Все потоковые writers должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те методы, которые определены здесь, используются реестром кодека Python.

Аргумент stream должен быть файлоподобным объектом, открытым для записи текста или двоичных данных, в зависимости от конкретного кодека.

Класс codecs.StreamWriter() может реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Смотрите раздел "Обработчики ошибок", что бы узнать какие стандартные обработчики ошибок может поддерживать базовый потоковый кодек.

Аргумент errors будет присвоен атрибуту с тем же именем. Наличие этого атрибута позволяет переключаться между различными стратегиями обработки ошибок во время существования объекта StreamWriter.

Класс codecs.StreamWriter() определяет следующие методы, которые должен определить каждый потоковый writer.

write(object):

Метод write() записывает содержимое объекта object, закодированное в поток.

writelines(list):

Метод writelines() записывает объединенный список строк list в поток, возможно путем повторного использования метода write(). Стандартные межбайтовые кодеки не поддерживают этот метод.

reset():

Метод reset() очищает и сбрасывает буферы кодека, используемые для сохранения состояния. Вызов этого метода должен гарантировать, что данные на выходе переведены в чистое состояние, что позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.

В дополнение к вышеуказанным методам StreamWriter должен также наследовать все другие методы и атрибуты от базового потока.

Объект StreamReader.

Класс StreamReader является подклассом базового класса Codec и определяет следующие методы, которые должен определить каждый reader потока, чтобы быть совместимым с реестром кодека Python.

codecs.StreamReader(stream, errors='strict'):

Класс codecs.StreamReader() определяет конструктор для экземпляра StreamReader. Все читатели stream должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но используются реестром кодека Python только те методы, которые определены здесь.

Аргумент stream должен быть файлоподобным объектом, открытым для чтения текстовых или двоичных данных, в зависимости от конкретного кодека.

Класс codecs.StreamReader() может реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Смотрите раздел "Обработчики ошибок", что бы узнать какие стандартные обработчики ошибок может поддерживать базовый потоковый кодек.

Аргумент errors будет присвоен атрибуту с тем же именем. Наличие этого атрибута позволяет переключаться между различными стратегиями обработки ошибок во время существования объекта StreamReader.

Набор допустимых значений для аргумента errors может быть расширен с помощью функции модуля codecs.register_error()

Класс codecs.StreamReader() определяет следующие методы, которые должен определить каждый reader потока.

read([size[, chars[, firstline]]]):

Метод read() декодирует данные из потока и возвращает результирующий объект.

Аргумент chars указывает количество возвращаемых декодированных кодовых точек или байтов. Метод read() никогда не возвращает больше данных, чем требуется, но он может возвращать меньше, если их недостаточно.

Аргумент size указывает приблизительное максимальное число закодированных байтов или кодовых точек, считываемых для декодирования. Декодер может изменить эту настройку соответствующим образом. Значение по умолчанию -1 указывает на то, чтобы читать и декодировать как можно больше. Этот параметр предназначен для предотвращения необходимости декодирования огромных файлов за один шаг.

Флаг firstline указывает, что достаточно вернуть только первую строку, если в последующих строках имеются ошибки декодирования.

Метод должен использовать стратегию жадного чтения, означающую, что он должен прочитать столько данных, сколько разрешено в определении кодирования и заданного размера, например, если в потоке доступны необязательные окончания кодирования или маркеры состояния, они также должны быть прочитаны.

readline([size[, keepends]]):

Метод readline() читает одну строку из входного потока и возвращает декодированные данные. Аргумент size , если он задан, передается в качестве аргумента размера в метод потока read().

Если keepends=False, то окончания строк будут удалены из возвращенных строк.

readlines([sizehint[, keepends]]):

Метод readlines() читает все строки, доступные в потоке ввода и возвращает их в виде списка строк. Окончания строк реализуются с помощью метода decode() кодека и включаются в список записей, если keepends имеет значение True.

Аргумент sizehint, если он задан, передается в качестве аргумента size в метод потока read().

reset():

Сбрасывает буферы кодека, используемые для сохранения состояния. Обратите внимание, что никакого изменения положения потока не должно происходить. Этот метод в первую очередь предназначен для восстановления после ошибок декодирования.

В дополнение к вышеуказанным методам StreamReader должен также наследовать все другие методы и атрибуты от базового потока.

Объект StreamReaderWriter.

StreamReaderWriter - это удобный класс, который позволяет оборачивать потоки, работающие как в режиме чтения, так и в режиме записи.

Конструкция такова, что для построения экземпляра можно использовать фабричные функции, возвращаемые функцией codecs.lookup().

codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict'):

Класс codecs.StreamReaderWriter() создает экземпляр StreamReaderWriter. Экземпляры StreamReaderWriter определяют объединенные интерфейсы классов codecs.StreamReader и codecs.StreamWriter. Они наследуют все остальные методы и атрибуты от базового потока.

Аргумент stream должен быть файлоподобным объектом.

Читатель Reader и писатель Writer должны быть фабричными функциями или классами, обеспечивающими интерфейсы StreamReader и StreamWriter соответственно.

Обработка ошибок выполняется так же, как определено для потокового чтения и записи.

Объект StreamRecoder.

StreamRecoder преобразует данные из одной кодировки в другую, что иногда полезно при работе с различными средами кодирования.

Конструкция такова, что для построения экземпляра можно использовать фабричные функции, возвращаемые функцией codecs.lookup()

codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict'):

Класс codecs.StreamRecoder() создает экземпляр StreamRecoder, который реализует двустороннее преобразование: encode и decode работает на интерфейсе - данные видны коду, вызывающему read() и write(), в то время как Reader и Writer работают на бэкэнде - данные в stream.

Можно использовать этот объект для прозрачного перекодирования, например, с Latin-1 в UTF-8 и обратно.

Аргумент stream должен быть файлоподобным объектом.

Аргументы encode и decode должны соответствовать интерфейсу кодека. Reader и Writer должны быть фабричными функциями или классами, обеспечивающими объекты интерфейса StreamReader и StreamWriter соответственно.

Обработка ошибок errors выполняется тем же способом, что и для чтения и записи потока.

Экземпляры StreamRecoder определяют объединенные интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от базового потока.

Класс StreamRecoder может прозрачно преобразовывать между кодировками, принимая поток, который возвращает данные в кодировке №1, и ведет себя как поток, возвращающий данные в кодировке №2.

Например, если есть входной файл file в кодировке Latin-1, то можно обернуть его StreamRecoder, чтобы вернуть байты, закодированные в UTF-8:

Пример преобразования между кодировками файлов

new_file = codecs.StreamRecoder(file,
    # Используется функцией read() для кодирования результатов
    # и функцией write() для декодирования входных данных.
    codecs.getencoder('utf-8'), codecs.getdecoder('utf-8'),
    # reader/writer: используется для чтения и записи в поток.
    codecs.getreader('latin-1'), codecs.getwriter('latin-1'))