Spec-Zone.ru › Python 3.8

codecs — Реестр кодировок и базовые классы

Исходный код: Lib/codecs.py

Этот модуль определяет базовые классы для стандартных кодировок Python (кодировщиков и декодировщиков) и предоставляет доступ к внутреннему регистру кодировок Python, который управляет процессом поиска кодировок и обработки ошибок. Большинство стандартных кодировок являются кодировками текста, которые кодируют текст в байты, но также существуют кодировки, которые кодируют текст в текст и байты в байты. Пользовательские кодировки могут кодировать и декодировать между произвольными типами, но некоторые функции модуля ограничены использованием именно с кодировками текста или с кодировками, которые кодируют в bytes.

Модуль определяет следующие функции для кодирования и декодирования с любой кодировкой:

codecs.encode(obj, encoding='utf-8', errors='strict')

Кодирует obj с помощью кодировки, зарегистрированной для encoding.

Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок 'strict' , что означает, что ошибки кодирования вызывают ValueError (или более специализированный подкласс кодировки, такой как UnicodeEncodeError). Дополнительную информацию об обработке ошибок кодировок см. в разделе Базовые классы кодировок.

codecs.decode(obj, encoding='utf-8', errors='strict')

Декодирует obj с помощью кодировки, зарегистрированной для encoding.

Errors можно указать для настройки желаемой схемы обработки ошибок. По умолчанию используется обработчик ошибок 'strict' , что означает, что ошибки декодирования вызывают ValueError (или более специализированный подкласс кодировки, такой как UnicodeDecodeError). Дополнительную информацию об обработке ошибок кодировок см. в разделе Базовые классы кодировок.

Полные сведения о каждой кодировке также можно получить напрямую:

codecs.lookup(encoding)

Ищет информацию о кодировке в регистре кодировок Python и возвращает объект CodecInfo, как определено ниже.

Кодировки сначала ищутся в кэше реестра. Если не найдено, сканируется список зарегистрированных функций поиска. Если объект CodecInfo не найден, возникает ошибка LookupError. В противном случае объект CodecInfo сохраняется в кэше и возвращается вызывающей стороне.

class codecs.CodecInfo(encode, decode, streamreader=None, streamwriter=None, incrementalencoder=None, incrementaldecoder=None, name=None)

Детали кодировки при поиске в реестре кодировок. Аргументы конструктора хранятся в атрибутах с одинаковыми именами:

name

Имя кодировки.

encode
decode

Функции статичного кодирования и декодирования. Они должны быть функциями или методами, которые имеют тот же интерфейс, что и методы encode() и decode() экземпляров Codec (см. Интерфейс кодировок). Ожидается, что функции или методы будут работать в бессостоятельном режиме.

incrementalencoder
incrementaldecoder

Классы или фабричные функции для инкрементального кодирования и декодирования. Они должны предоставить интерфейс, определенный базовыми классами IncrementalEncoder и IncrementalDecoder соответственно. Инкрементальные кодировки могут сохранять состояние.

streamwriter
streamreader

Классы или фабричные функции для работы с потоками записи и чтения. Они должны предоставить интерфейс, определенный базовыми классами StreamWriter и StreamReader соответственно. Потоковые кодировки могут сохранять состояние.

Для упрощения доступа к различным компонентам кодировок модуль предоставляет дополнительные функции, использующие lookup() для поиска кодировки:

codecs.getencoder(encoding)

Ищет кодировку для заданной кодировки и возвращает её функцию кодирования.

Возбуждает LookupError в случае невозможности найти кодировку.

codecs.getdecoder(encoding)

Ищет кодировку для заданной кодировки и возвращает её функцию декодирования.

Возбуждает LookupError в случае невозможности найти кодировку.

codecs.getincrementalencoder(encoding)

Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию инкрементального кодирования.

Возбуждает LookupError в случае невозможности найти кодировку или если кодировка не поддерживает инкрементальное кодирование.

codecs.getincrementaldecoder(encoding)

Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию инкрементального декодирования.

Возбуждает LookupError в случае невозможности найти кодировку или если кодировка не поддерживает инкрементальное декодирование.

codecs.getreader(encoding)

Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию StreamReader.

Возбуждает LookupError в случае невозможности найти кодировку.

codecs.getwriter(encoding)

Ищет кодировку для заданной кодировки и возвращает её класс или фабричную функцию StreamWriter.

Возбуждает LookupError в случае невозможности найти кодировку.

Пользовательские кодировки доступны путем регистрации подходящей функции поиска кодировок:

codecs.register(search_function)

Регистрирует функцию поиска кодировки. Функции поиска принимают один аргумент — имя кодировки в нижнем регистре, и возвращают объект CodecInfo. Если функция поиска не может найти заданную кодировку, она должна вернуть None.

Примечание

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

Хотя встроенные open() и связанный с ним модуль io являются рекомендуемым подходом для работы с закодированными текстовыми файлами, этот модуль предоставляет дополнительные утилитарные функции и классы, которые позволяют использовать более широкий спектр кодировок при работе с бинарными файлами:

codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=-1)

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

Примечание

Внутренние закодированные файлы всегда открываются в бинарном режиме. Автоматическое преобразование '\n' при чтении и записи не выполняется. Аргумент mode может быть любым бинарным режимом, приемлемым для встроенной функции open(); 'b' добавляется автоматически.

encoding указывает используемую кодировку файла. Допустимы любые кодировки, которые кодируют и декодируют байты, а типы данных, поддерживаемые методами файла, зависят от используемой кодировки.

errors может быть указан для определения обработки ошибок. По умолчанию используется 'strict' , что приводит к исключению ValueError в случае ошибки кодирования.

buffering имеет то же значение, что и для встроенной функции open(). По умолчанию используется -1, что означает использование размера буфера по умолчанию.

END_OF_DOCUMENT_MARKER
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict')

Возвращает экземпляр StreamRecoder, обернутую версию file, которая обеспечивает прозрачное преобразование кодировок. Исходный файл закрывается при закрытии обернутой версии.

Данные, записанные в обернутый файл, декодируются в соответствии с заданной data_encoding, а затем записываются в исходный файл в виде байтов с использованием file_encoding. Байты, считанные из исходного файла, декодируются в соответствии с file_encoding, а результат кодируется с использованием data_encoding.

Если file_encoding не задано, оно по умолчанию равно data_encoding.

errors может быть задан для определения обработки ошибок. По умолчанию это 'strict', что приводит к тому, что ValueError будет поднят в случае возникновения ошибки кодирования.

codecs.iterencode(iterator, encoding, errors='strict', **kwargs)

Использует инкрементальный кодер для итеративного кодирования входных данных, предоставленных iterator. Эта функция является генератором. Аргумент errors (а также любые другие ключевые аргументы) передается инкрементальному кодеру.

Эта функция требует, чтобы кодек принимал объекты типа str для кодирования. Поэтому она не поддерживает кодеры байты-в-байты, такие как base64_codec.

codecs.iterdecode(iterator, encoding, errors='strict', **kwargs)

Использует инкрементальный декодер для итеративного декодирования входных данных, предоставленных iterator. Эта функция является генератором. Аргумент errors (а также любые другие ключевые аргументы) передается инкрементальному декодеру.

Эта функция требует, чтобы кодек принимал объекты типа bytes для декодирования. Поэтому она не поддерживает кодеры текст-в-текст, такие как rot_13, хотя rot_13 может быть использовано эквивалентно с iterencode().

Модуль также предоставляет следующие константы, которые полезны для чтения и записи в платформозависимые файлы:

codecs.BOM
codecs.BOM_BE
codecs.BOM_LE
codecs.BOM_UTF8
codecs.BOM_UTF16
codecs.BOM_UTF16_BE
codecs.BOM_UTF16_LE
codecs.BOM_UTF32
codecs.BOM_UTF32_BE
codecs.BOM_UTF32_LE

Эти константы определяют различные последовательности байтов, являющиеся метками порядка байтов Юникода (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания используемого порядка байтов, а в UTF-8 — в качестве подписи Юникода. BOM_UTF16 равно либо BOM_UTF16_BE, либо BOM_UTF16_LE в зависимости от родного порядка байтов платформы, BOM является псевдонимом для BOM_UTF16, BOM_LE для BOM_UTF16_LE и BOM_BE для BOM_UTF16_BE. Остальные представляют BOM в кодировках UTF-8 и UTF-32.

Базовые классы кодировщиков

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

Каждый кодировщик должен определить четыре интерфейса, чтобы быть пригодным в качестве кодировщика в Python: бессостояние кодировщик, бессостояние декодер, потоковый читатель и потоковый писатель. Потоковые читатели и писатели обычно повторно используют бессостояние кодировщик/декодер для реализации протоколов файлов. Авторы кодировщиков также должны определить, как кодировщик будет обрабатывать ошибки кодирования и декодирования.

Обработчики ошибок

Для упрощения и стандартизации обработки ошибок кодировщики могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors. Все стандартные кодировщики Python определяют и реализуют следующие строковые значения:

Значение

Значение

'strict'

Вызвать UnicodeError (или подкласс); это значение по умолчанию. Реализовано в strict_errors().

'ignore'

Пропустить неверные данные и продолжить без дальнейших уведомлений. Реализовано в ignore_errors().

Следующие обработчики ошибок применимы только к кодировкам текста:

Значение

Значение

'replace'

Заменить подходящим маркером; Python будет использовать официальный U+FFFD ЗАМЕЩАЮЩИЙ СИМВОЛ для встроенных кодировщиков при декодировании и ‘?’ при кодировании. Реализовано в replace_errors().

'xmlcharrefreplace'

Заменить соответствующей ссылкой на символ XML (только для кодирования). Реализовано в xmlcharrefreplace_errors().

'backslashreplace'

Заменить последовательностями экранирования с обратной косой чертой. Реализовано в backslashreplace_errors().

'namereplace'

Заменить последовательностями экранирования \N{...} (только для кодирования). Реализовано в namereplace_errors().

'surrogateescape'

При декодировании заменить байт отдельным кодом суррогата, изменяющимся от U+DC80 до U+DCFF. Этот код будет затем преобразован обратно в тот же байт, когда используется обработчик ошибок 'surrogateescape' при кодировании данных. (См. PEP 383 для более подробной информации.)

В дополнение к этому, следующий обработчик ошибок специфичен для данного кодировщика:

Значение

Кодировщики

Значение

'surrogatepass'

utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le

Разрешить кодирование и декодирование кодов суррогатов. Эти кодировщики обычно рассматривают присутствие суррогатов как ошибку.

В версии 3.1: Обработчики ошибок 'surrogateescape' и 'surrogatepass'.

Изменено в версии 3.4: Обработчики ошибок 'surrogatepass' теперь работают с кодировщиками utf-16* и utf-32*.

В версии 3.5: Обработчик ошибок 'namereplace'.

Изменено в версии 3.5: Обработчики ошибок 'backslashreplace' теперь работают с декодированием и переводом.

Набор разрешенных значений может быть расширен путем регистрации нового обработчика ошибок:

codecs.register_error(name, error_handler)

Регистрирует функцию обработки ошибок error_handler под именем name. Функция error_handler вызывается при кодировании и декодировании в случае ошибки, когда name задан как параметр errors.

При кодировании функция error_handler вызывается с экземпляром UnicodeEncodeError, содержащим информацию о местоположении ошибки. Обработчик ошибок должен либо вызвать это, либо другое исключение, или вернуть кортеж с заменой для некодируемой части входных данных и позиции, где следует продолжить кодирование. Замена может быть либо str, либо bytes. Если замена является байтами, кодировщик просто скопирует их в буфер вывода. Если замена является строкой, кодировщик закодирует замену. Кодирование продолжается на исходных входных данных в указанной позиции. Отрицательные значения позиции будут интерпретироваться как относительные к концу строки входных данных. Если полученная позиция выходит за пределы, будет выброшено IndexError.

Декодирование и перевод работают аналогично, за исключением того, что обработчику будет передан UnicodeDecodeError или UnicodeTranslateError, а замена из обработчика ошибок будет помещена непосредственно в вывод.

Ранее зарегистрированные обработчики ошибок (включая стандартные обработчики ошибок) могут быть найдены по имени:

codecs.lookup_error(name)

Возвращает обработчик ошибок, зарегистрированный под именем name.

Вызывает LookupError в случае, если обработчик не найден.

Следующие стандартные обработчики ошибок также доступны как функции уровня модуля:

codecs.strict_errors(exception)

Реализует обработку ошибок 'strict': каждая ошибка кодирования или декодирования вызывает исключение UnicodeError.

codecs.replace_errors(exception)

Реализует обработку ошибок 'replace' (только для кодировок текста): заменяет '?' при ошибках кодирования (что будет закодировано кодировщиком) и '\ufffd' (замещающий символ Unicode) при ошибках декодирования.

codecs.ignore_errors(exception)

Реализует обработку ошибок 'ignore': некорректные данные игнорируются, и кодирование или декодирование продолжаются без дальнейших уведомлений.

codecs.xmlcharrefreplace_errors(exception)

Реализует обработку ошибок 'xmlcharrefreplace' (только для кодирования с кодировками текста): некодируемый символ заменяется соответствующей ссылкой на символ XML.

codecs.backslashreplace_errors(exception)

Реализует обработку ошибок 'backslashreplace' (только для кодировок текста): некорректные данные заменяются последовательностью экранирования с обратной косой чертой.

codecs.namereplace_errors(exception)

Реализует обработку ошибок 'namereplace' (только для кодирования с кодировками текста): некодируемый символ заменяется последовательностью экранирования \N{...}.

Новое в версии 3.5.

Бессостоятельные кодирование и декодирование

Базовый Codec класс определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодера и декодера:

Codec.encode(input[, errors])

Кодирует объект input и возвращает кортеж (объект-выход, длина потреблённого). Например, кодирование текста преобразует строковый объект в байтовый объект, используя кодировку набора символов (например, cp1252 или iso-8859-1).

Аргумент errors определяет обработку ошибок. По умолчанию используется обработка 'strict'.

Метод не должен хранить состояние в экземпляре Codec. Используйте StreamWriter для кодеров, которым необходимо хранить состояние для повышения эффективности кодирования.

Кодер должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа объекта-выхода в этом случае.

Codec.decode(input[, errors])

Декодирует объект input и возвращает кортеж (объект-выход, длина потреблённого). Например, для кодирования текста декодирование преобразует байтовый объект, закодированный с помощью кодировки набора символов, в строковый объект.

Для кодировок текста и кодировок байты-в-байты, input должен быть байтовым объектом или объектом, предоставляющим интерфейс чтения только для буфера – например, объекты буфера и файлы с отображением памяти.

Аргумент errors определяет обработку ошибок. По умолчанию используется обработка 'strict'.

Метод не должен хранить состояние в экземпляре Codec. Используйте StreamReader для кодеров, которым необходимо хранить состояние для повышения эффективности декодирования.

Декодер должен уметь обрабатывать вход нулевой длины и возвращать пустой объект типа объекта-выхода в этом случае.

Инкрементальное кодирование и декодирование

Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементального кодирования и декодирования. Кодирование/декодирование входных данных выполняется не с помощью одного вызова бессостоятельного кодера/декодера, а с помощью нескольких вызовов метода encode()/decode() инкрементального кодера/декодера. Инкрементальный кодер/декодер отслеживает процесс кодирования/декодирования во время вызовов методов.

Объединённый результат вызовов метода encode()/decode() эквивалентен результату кодирования/декодирования всех отдельных входных данных, объединённых в один вход, бессостоятельным кодером/декодером.

Объекты IncrementalEncoder

Класс IncrementalEncoder используется для кодирования входных данных поэтапно. Он определяет следующие методы, которые должен определить каждый инкрементальный кодер для совместимости с реестром кодировок Python.

class codecs.IncrementalEncoder(errors='strict')

Конструктор экземпляра IncrementalEncoder.

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

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

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

encode(object[, final])

Кодирует object (принимая во внимание текущее состояние кодера) и возвращает закодированный объект. Если это последний вызов encode(), final должно быть true (по умолчанию false).

reset()

Сброс кодера в начальное состояние. Выходные данные отбрасываются: вызовите .encode(object, final=True), передав пустую строку байтов или текст, если необходимо, чтобы сбросить кодер и получить выходные данные.

getstate()

Возвращает текущее состояние кодера, которое должно быть целым числом. Реализация должна гарантировать, что 0 является наиболее распространённым состоянием. (Состояния, которые более сложные, чем целые числа, могут быть преобразованы в целые числа путём сериализации/пиклингования состояния и кодирования байтов полученной строки в целое число.)

setstate(state)

Устанавливает состояние кодера в state. state должно быть состоянием кодера, возвращённым методом getstate().

Объекты IncrementalDecoder

Класс IncrementalDecoder используется для декодирования входных данных поэтапно. Он определяет следующие методы, которые должен определить каждый инкрементальный декодер для совместимости с реестром кодировок Python.

class codecs.IncrementalDecoder(errors='strict')

Конструктор экземпляра IncrementalDecoder.

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

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

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

decode(object[, final])

Декодирует object (принимая во внимание текущее состояние декодера) и возвращает декодированный объект. Если это последний вызов decode(), final должно быть true (по умолчанию false). Если final true, декодер должен полностью декодировать вход и очистить все буферы. Если это невозможно (например, из-за неполных байтовых последовательностей в конце входных данных), он должен инициировать обработку ошибок так же, как и в бессостоятельном случае (что может вызвать исключение).

reset()

Сброс декодера в начальное состояние.

getstate()

Возвращает текущее состояние декодера. Это должен быть кортеж с двумя элементами: первый — буфер с ещё не декодированными входными данными, второй — целое число и дополнительная информация о состоянии. (Реализация должна гарантировать, что 0 является наиболее распространённой дополнительной информацией о состоянии.) Если эта дополнительная информация о состоянии 0 должен быть возможным установить декодер в состояние, в котором нет буферизованных входных данных и 0 как дополнительная информация о состоянии, чтобы подача ранее буферизованных входных данных в декодер вернула его в предыдущее состояние без вывода каких-либо данных. (Дополнительная информация о состоянии, которая более сложная, чем целые числа, может быть преобразована в целое число путём сериализации/пиклингования информации и кодирования байтов полученной строки в целое число.)

setstate(state)

Устанавливает состояние декодера в state. state должен быть состоянием декодера, возвращённым методом getstate().

Кодирование и декодирование потоков

Классы StreamWriter и StreamReader предоставляют универсальные рабочие интерфейсы, которые можно легко использовать для реализации новых подмодулей кодирования. См. encodings.utf_8 для примера того, как это делается.

Объекты StreamWriter

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

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

Конструктор для экземпляра StreamWriter.

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

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

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

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

write(object)

Записывает содержимое объекта, закодированное в поток.

writelines(list)

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

reset()

Очищает и сбрасывает буферы кодека, используемые для хранения состояния.

Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, которое позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.

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

Объекты StreamReader

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

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

Конструктор для экземпляра StreamReader.

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

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

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

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

Множество разрешенных значений для аргумента errors можно расширить с помощью register_error().

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

Декодирует данные из потока и возвращает результат.

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

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

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

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

readline([size[, keepends]])

Считывает одну строку из входного потока и возвращает закодированные данные.

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

Если keepends ложно, окончания строк удаляются из возвращаемых строк.

readlines([sizehint[, keepends]])

Считывает все доступные строки из входного потока и возвращает их в виде списка строк.

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

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

reset()

Сбрасывает буферы кодека, используемые для хранения состояния.

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

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

Объекты StreamReaderWriter

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

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

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

Создает экземпляр StreamReaderWriter. stream должен быть объектом, похожим на файл. Reader и Writer должны быть функциями-фабриками или классами, предоставляющими интерфейс StreamReader и StreamWriter соответственно. Обработка ошибок выполняется так же, как определено для объектов чтения и записи потоков.

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

Объекты StreamRecoder

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

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

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

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

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

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

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

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

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

Обзор кодировок и Unicode

Строки хранятся внутри как последовательности кодовых точек в диапазоне 0x0–0x10FFFF. (См. PEP 393 для получения более подробной информации об реализации.) Как только строковый объект используется вне ЦП и памяти, возникает проблема с порядком байтов и способом хранения этих массивов в байтах. Как и в случае с другими кодеками, сериализация строки в последовательность байтов называется кодированием, а восстановление строки из последовательности байтов — декодированием. Существует множество различных кодировок текста, которые коллективно называются кодировками текста.

Самая простая кодировка текста (называемая 'latin-1' или 'iso-8859-1') сопоставляет кодовые точки 0–255 байтам 0x0–0xff, что означает, что строковый объект, содержащий кодовые точки выше U+00FF, не может быть закодирован этим кодеком. При попытке сделать это будет возбуждено исключение UnicodeEncodeError в виде (хотя детали сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in position 3: ordinal not in range(256).

Есть ещё одна группа кодировок (так называемые кодировки charmap), которые выбирают другое подмножество всех кодовых точек Unicode и способ отображения этих кодовых точек в байты 0x0–0xff. Чтобы увидеть, как это делается, просто откройте, например, encodings/cp1252.py (это кодировка, используемая в основном в Windows). Есть строковая константа с 256 символами, которая показывает, какой символ отображается в какой байт.

Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простой и прямой способ хранения каждой кодовой точки Unicode — хранить каждую кодовую точку как четыре последовательных байта. Существуют две возможности: хранить байты в прямом или обратном порядке. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток заключается в том, что, например, если вы используете UTF-32-BE на машине с обратным порядком байтов, вам всегда нужно будет переставлять байты при кодировании и декодировании. UTF-32 решает эту проблему: байты всегда будут в естественном порядке байтов. Однако, если эти байты будут считаны ЦП с другим порядком байтов, байты необходимо будет переставить. Чтобы определить порядок байтов последовательности байтов UTF-16 или UTF-32, используется так называемый BOM («Byte Order Mark»). Это символ Unicode U+FEFF. Этот символ может быть добавлен в начало каждой последовательности байтов UTF-16 или UTF-32. Переставленная версия этого символа (0xFFFE) — недопустимый символ, который не может встречаться в тексте Unicode. Поэтому, если первый символ в последовательности байтов UTF-16 или UTF-32 оказывается символом U+FFFE, байты необходимо переставить при декодировании. К сожалению, символ U+FEFF имел второе назначение как ZERO WIDTH NO-BREAK SPACE: символ, у которого нет ширины и который не позволяет разбить слово. Его можно использовать, например, для указания алгоритму связывания (лигатур). В Unicode 4.0 использование U+FEFF в качестве ZERO WIDTH NO-BREAK SPACE устарело (и роль перешла к U+2060 (WORD JOINER)). Тем не менее, программное обеспечение Unicode по-прежнему должно уметь обрабатывать U+FEFF в обоих ролях: как BOM, это способ определения способа хранения закодированных байтов, и он исчезает после того, как последовательность байтов была декодирована в строку; как ZERO WIDTH NO-BREAK SPACE, это обычный символ, который будет декодирован как любой другой.

Существует ещё одна кодировка, которая может кодировать весь диапазон символов Unicode: UTF-8. UTF-8 — это кодировка в 8 бит, что означает, что проблем с порядком байтов в UTF-8 нет. Каждый байт в последовательности байтов UTF-8 состоит из двух частей: биты маркера (самые старшие биты) и биты полезной нагрузки. Битами маркера являются последовательность от нуля до четырёх 1 битов, за которыми следует 0 бит. Символы Unicode кодируются следующим образом (x — биты полезной нагрузки, которые, будучи соединены вместе, дают символ Unicode):

Диапазон

Кодирование

U-00000000 … U-0000007F

0xxxxxxx

U-00000080 … U-000007FF

110xxxxx 10xxxxxx

U-00000800 … U-0000FFFF

1110xxxx 10xxxxxx 10xxxxxx

U-00010000 … U-0010FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Самый младший бит символа Unicode — это самый правый бит x.

Так как UTF-8 — это кодировка в 8 бит, BOM не требуется, и любой символ U+FEFF в декодированной строке (даже если это первый символ) обрабатывается как ZERO WIDTH NO-BREAK SPACE.

Без внешней информации невозможно надёжно определить, какая кодировка была использована для кодирования строки. Каждая кодировка charmap может декодировать любую произвольную последовательность байтов. Однако это невозможно с UTF-8, поскольку последовательности байтов UTF-8 имеют структуру, которая не допускает произвольных последовательностей байтов. Чтобы повысить надёжность определения кодировки UTF-8, Microsoft придумала вариант UTF-8 (который Python 2.5 называет "utf-8-sig") для своей программы Блокнот: перед записью любого из символов Unicode в файл записывается закодированный в UTF-8 BOM (который выглядит так в виде последовательности байтов: 0xef, 0xbb, 0xbf). Так как маловероятно, что любой файл, закодированный в charmap, начнётся с этих значений байтов (которые, например, в iso-8859-1 будут соответствовать

это увеличивает вероятность того, что кодировка utf-8-sig может быть правильно угадана по последовательности байтов. Таким образом, здесь BOM не используется для определения порядка байтов, используемого для генерации последовательности байтов, а как подпись, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет 0xef, 0xbb, 0xbf как первые три байта в файл. При декодировании utf-8-sig пропустит эти три байта, если они встречаются как первые три байта в файле. В UTF-8 использование BOM не рекомендуется и его следует избегать.

Стандартные кодировки

Python предоставляет ряд встроенных кодеков, реализованных либо как функции C, либо с таблицами отображения в виде словарей. В следующей таблице перечислены кодеки по имени, вместе с несколькими общими псевдонимами и языками, для которых кодировка, вероятно, используется. Ни список псевдонимов, ни список языков не претендуют на полноту. Обратите внимание, что альтернативные варианты написания, которые отличаются только регистром или используют дефис вместо нижнего подчёркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом для кодека 'utf_8'.

Деталь реализации CPython: Некоторые распространённые кодировки могут обойти механизм поиска кодеков для повышения производительности. Эти возможности оптимизации распознаются CPython только для ограниченного набора (регистронезависимых) псевдонимов: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только Windows), ascii, us-ascii, utf-16, utf16, utf-32, utf32, и те же, используя нижние подчёркивания вместо дефисов. Использование альтернативных псевдонимов для этих кодировок может привести к замедлению выполнения.

Изменено в версии 3.6: Возможность оптимизации распознана для us-ascii.

Многие наборы символов поддерживают одни и те же языки. Они различаются отдельными символами (например, поддерживается ли символ EURO SIGN) и присвоением символов кодовым позициям. В частности, для европейских языков обычно существуют следующие варианты:

  • набор символов ISO 8859
  • страница кодов Microsoft Windows, обычно полученная из набора символов 8859, но заменяющая управляющие символы дополнительными графическими символами
  • страница кодов IBM EBCDIC
  • страница кодов IBM PC, совместимая с ASCII

Кодек

Псевдонимы

Языки

ascii

646, us-ascii

Английский

big5

big5-tw, csbig5

Традиционный китайский

big5hkscs

big5-hkscs, hkscs

Традиционный китайский

cp037

IBM037, IBM039

Английский

cp273

273, IBM273, csIBM273

Немецкий

Новое в версии 3.4.

cp424

EBCDIC-CP-HE, IBM424

Иврит

cp437

437, IBM437

Английский

cp500

EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500

Западная Европа

cp720

Арабский

cp737

Греческий

cp775

IBM775

Балтийские языки

cp850

850, IBM850

Западная Европа

cp852

852, IBM852

Центральная и Восточная Европа

cp855

855, IBM855

Болгарский, Белорусский, Македонский, Русский, Сербский

cp856

Иврит

cp857

857, IBM857

Турецкий

cp858

858, IBM858

Западная Европа

cp860

860, IBM860

Португальский

cp861

861, CP-IS, IBM861

Исландский

cp862

862, IBM862

Иврит

cp863

863, IBM863

Канадский

cp864

IBM864

Арабский

cp865

865, IBM865

Датский, Норвежский

cp866

866, IBM866

Русский

cp869

869, CP-GR, IBM869

Греческий

cp874

Тайский

cp875

Греческий

cp932

932, ms932, mskanji, ms-kanji

Японский

cp949

949, ms949, uhc

Корейский

cp950

950, ms950

Традиционный китайский

cp1006

Урду

cp1026

ibm1026

Турецкий

cp1125

1125, ibm1125, cp866u, ruscii

Украинский

Новое в версии 3.4.

cp1140

ibm1140

Западная Европа

cp1250

windows-1250

Центральная и Восточная Европа

cp1251

windows-1251

Болгарский, Белорусский, Македонский, Русский, Сербский

cp1252

windows-1252

Западная Европа

cp1253

windows-1253

Греческий

cp1254

windows-1254

Турецкий

cp1255

windows-1255

Иврит

cp1256

windows-1256

Арабский

cp1257

windows-1257

Балтийские языки

cp1258

windows-1258

Вьетнамский

euc_jp

eucjp, ujis, u-jis

Японский

euc_jis_2004

jisx0213, eucjis2004

Японский

euc_jisx0213

eucjisx0213

Японский

euc_kr

euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001

Корейский

gb2312

chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58

Упрощенный китайский

gbk

936, cp936, ms936

Объединенный китайский

gb18030

gb18030-2000

Объединенный китайский

hz

hzgb, hz-gb, hz-gb-2312

Упрощенный китайский

iso2022_jp

csiso2022jp, iso2022jp, iso-2022-jp

Японский

iso2022_jp_1

iso2022jp-1, iso-2022-jp-1

Японский

iso2022_jp_2

iso2022jp-2, iso-2022-jp-2

Японский, Корейский, Упрощенный китайский, Западная Европа, Греческий

iso2022_jp_2004

iso2022jp-2004, iso-2022-jp-2004

Японский

iso2022_jp_3

iso2022jp-3, iso-2022-jp-3

Японский

iso2022_jp_ext

iso2022jp-ext, iso-2022-jp-ext

Японский

iso2022_kr

csiso2022kr, iso2022kr, iso-2022-kr

Корейский

latin_1

iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1

Западная Европа

iso8859_2

iso-8859-2, latin2, L2

Центральная и Восточная Европа

iso8859_3

iso-8859-3, latin3, L3

Эсперанто, Мальтийский

iso8859_4

iso-8859-4, latin4, L4

Балтийские языки

iso8859_5

iso-8859-5, cyrillic

Болгарский, Белорусский, Македонский, Русский, Сербский

iso8859_6

iso-8859-6, arabic

Арабский

iso8859_7

iso-8859-7, greek, greek8

Греческий

iso8859_8

iso-8859-8, hebrew

Иврит

iso8859_9

iso-8859-9, latin5, L5

Турецкий

iso8859_10

iso-8859-10, latin6, L6

Языки Северной Европы

iso8859_11

iso-8859-11, thai

Тайские языки

iso8859_13

iso-8859-13, latin7, L7

Балтийские языки

iso8859_14

iso-8859-14, latin8, L8

Келтские языки

iso8859_15

iso-8859-15, latin9, L9

Западная Европа

iso8859_16

iso-8859-16, latin10, L10

Юго-Восточная Европа

johab

cp1361, ms1361

Корейский

koi8_r

Русский

koi8_t

Таджикский

Новое в версии 3.5.

koi8_u

Украинский

kz1048

kz_1048, strk1048_2002, rk1048

Казахский

Новое в версии 3.5.

mac_cyrillic

maccyrillic

Болгарский, Белорусский, Македонский, Русский, Сербский

mac_greek

macgreek

Греческий

mac_iceland

maciceland

Исландский

mac_latin2

maclatin2, maccentraleurope

Центральная и Восточная Европа

mac_roman

macroman, macintosh

Западная Европа

mac_turkish

macturkish

Турецкий

ptcp154

csptcp154, pt154, cp154, cyrillic-asian

Казахский

shift_jis

csshiftjis, shiftjis, sjis, s_jis

Японский

shift_jis_2004

shiftjis2004, sjis_2004, sjis2004

Японский

shift_jisx0213

shiftjisx0213, sjisx0213, s_jisx0213

Японский

utf_32

U32, utf32

все языки

utf_32_be

UTF-32BE

все языки

utf_32_le

UTF-32LE

все языки

utf_16

U16, utf16

все языки

utf_16_be

UTF-16BE

все языки

utf_16_le

UTF-16LE

все языки

utf_7

U7, unicode-1-1-utf-7

все языки

utf_8

U8, UTF, utf8, cp65001

все языки

utf_8_sig

все языки

Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не допускают кодирования кодовых точек суррогатных символов (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие кодовым точкам суррогатных символов.

Изменено в версии 3.8: cp65001 теперь является псевдонимом для utf_8.

Утилиты кодирования, специфичные для Python

Несколько предопределённых кодеков специфичны для Python, поэтому их имена кодеков не имеют смысла вне Python. Эти кодеки перечислены в таблицах ниже в зависимости от ожидаемых типов входных и выходных данных (обратите внимание, что, хотя текстовые кодировки являются наиболее распространённым случаем использования кодеков, основная инфраструктура кодеков поддерживает произвольные преобразования данных, а не только текстовые кодировки). Для асимметричных кодеков указанное значение описывает направление кодирования.

Текстовые кодировки

Следующие кодеки обеспечивают кодирование str в bytes и декодирование байтоподобных объектов в str, аналогично кодировкам Unicode.

Кодек

Псевдонимы

Значение

idna

Реализует RFC 3490, также см. encodings.idna. Поддерживается только errors='strict'.

mbcs

ansi, dbcs

Только Windows: закодировать операнд в соответствии со страницей кодов ANSI (CP_ACP).

oem

Только Windows: закодировать операнд в соответствии со страницей кодов OEM (CP_OEMCP).

Новое в версии 3.6.

palmos

Кодировка PalmOS 3.5.

punycode

Реализует RFC 3492. Состоятельные кодеки не поддерживаются.

raw_unicode_escape

Latin-1 кодировка с \uXXXX и \UXXXXXXXX для других кодовых точек. Существующие обратные слэши не экранируются каким-либо образом. Используется в протоколе Python pickle.

undefined

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

unicode_escape

Кодирование, подходящее для содержимого литерала Unicode в коде Python, закодированном в ASCII, за исключением того, что кавычки не экранируются. Декодировать из исходного кода Latin-1. Имейте в виду, что исходный код Python по умолчанию использует UTF-8.

Изменено в версии 3.8: Кодек «unicode_internal» удалён.

Бинарные преобразования

Следующие кодеки обеспечивают бинарные преобразования: отображение байтоподобных объектов в bytes. Они не поддерживаются bytes.decode() (который производит только выходной str).

Кодек

Псевдонимы

Значение

Кодер / декодер

base64_codec 1

base64, base_64

Преобразовать операнд в многострочный MIME base64 (результат всегда включает в себя конечный '\n').

Изменено в версии 3.4: принимает любой байтоподобный объект в качестве входных данных для кодирования и декодирования

base64.encodebytes() / base64.decodebytes()

bz2_codec

bz2

Сжать операнд с помощью bz2.

bz2.compress() / bz2.decompress()

hex_codec

hex

Преобразовать операнд в шестнадцатеричное представление с двумя цифрами на байт.

binascii.b2a_hex() / binascii.a2b_hex()

quopri_codec

quopri, quotedprintable, quoted_printable

Преобразовать операнд в MIME quoted printable.

quopri.encode() с quotetabs=True / quopri.decode()

uu_codec

uu

Преобразовать операнд с помощью uuencode.

uu.encode() / uu.decode()

zlib_codec

zip, zlib

Сжать операнд с помощью gzip.

zlib.compress() / zlib.decompress()

1

В дополнение к байтоподобным объектам, 'base64_codec' также принимает ASCII-только экземпляры str для декодирования

Новое в версии 3.2: Восстановление бинарных преобразований.

Изменено в версии 3.4: Восстановление псевдонимов для бинарных преобразований.

Текстовые преобразования

Следующий кодек предоставляет текстовое преобразование: отображение str в str. Он не поддерживается str.encode() (который производит только выходные bytes).

Кодек

Псевдонимы

Значение

rot_13

rot13

Возвращает шифрование Цезаря операнда.

Новое в версии 3.2: Восстановление текстового преобразования rot_13.

Изменено в версии 3.4: Восстановление псевдонима rot13.

encodings.idna — Международные доменные имена в приложениях

Этот модуль реализует RFC 3490 (Международные доменные имена в приложениях) и RFC 3492 (Nameprep: Профиль Stringprep для международных доменных имён (IDN)). Он построен на основе кодировки punycode и stringprep.

Если вам нужен стандарт IDNA 2008 из RFC 5891 и RFC 5895, используйте стороннюю idna module <https://pypi.org/project/idna/>_.

Эти RFC вместе определяют протокол для поддержки символов, отличных от ASCII, в доменных именах. Доменное имя, содержащее символы, отличные от ASCII (например, www.Alliancefrançaise.nu), преобразуется в совместимую с ASCII кодировку (ACE, например, www.xn--alliancefranaise-npb.nu). Форма ACE доменного имени затем используется во всех местах, где произвольные символы не допускаются протоколом, таких как запросы DNS, поля HTTP Host и так далее. Это преобразование выполняется в приложении; если возможно, незаметно для пользователя: приложение должно прозрачно преобразовывать метки доменных имён Unicode в IDNA в сети и преобразовывать метки ACE обратно в Unicode перед представлением их пользователю.

Python поддерживает это преобразование несколькими способами: кодек idna выполняет преобразование между Unicode и ACE, разделяя входную строку на метки на основе символов-разделителей, определённых в разделе 3.1 RFC 3490, и преобразует каждую метку в ACE по мере необходимости, и наоборот, разделяя входную строку байтов на метки на основе разделителя . и преобразуя любые обнаруженные метки ACE в Unicode. Кроме того, модуль socket прозрачно преобразует имена хостов Unicode в ACE, так что приложениям не нужно беспокоиться о преобразовании имён хостов самим, когда они передают их модулю сокетов. Кроме того, модули, у которых имена хостов являются параметрами функций, такие как http.client и ftplib, принимают имена хостов Unicode (http.client затем также прозрачно отправляет имя хоста IDNA в поле Host, если отправляет это поле вообще).

При получении имён хостов из сети (например, при обратном поиске имён) автоматическое преобразование в Unicode не выполняется: приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Unicode.

Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённые нормализации имён хостов для достижения регистронезависимости международных доменных имён и унификации похожих символов. Функции nameprep можно использовать напрямую, если необходимо.

encodings.idna.nameprep(label)

Возвращает преобразованную версию label. Реализация в настоящее время предполагает запросы, поэтому AllowUnassigned равно true.

encodings.idna.ToASCII(label)

Преобразует метку в ASCII, как указано в RFC 3490. UseSTD3ASCIIRules предполагается как false.

encodings.idna.ToUnicode(label)

Преобразует метку в Unicode, как указано в RFC 3490.

encodings.mbcs — Кодовая страница Windows ANSI

Этот модуль реализует кодовую страницу ANSI (CP_ACP).

Доступность: Только Windows.

Изменено в версии 3.3: Поддержка любого обработчика ошибок.

Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace' всегда использовался для кодирования, а 'ignore' для декодирования.

encodings.utf_8_sig — Кодек UTF-8 с сигнатурой BOM

Этот модуль реализует вариант кодека UTF-8. При кодировании к закодированным в UTF-8 байтам будет добавлен BOM, закодированный в UTF-8. Для состоятельного кодера это делается только один раз (при первом записи в поток байтов). При декодировании необязательный BOM, закодированный в UTF-8, в начале данных будет пропущен.

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/codecs.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API