Документация Python неофициальный перевод
Содержание страницы

codecs – Реестр кодеков и базовые классыcodecs – Codec registry and base classes

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


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

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

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

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

Errors may be given to set the desired error handling scheme. The default error handler is 'strict' meaning that encoding errors raise ValueError (or a more codec specific subclass, such as UnicodeEncodeError). Refer to Codec Base Classes for more information on codec error handling.

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

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

Errors may be given to set the desired error handling scheme. The default error handler is 'strict' meaning that decoding errors raise ValueError (or a more codec specific subclass, such as UnicodeDecodeError). Refer to Codec Base Classes for more information on codec error handling.

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

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 (см. Интерфейс 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, что означает использование размера буфера по умолчанию.

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

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

Базовые классы кодековCodec Base Classes

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

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

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

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

Значение

Значение

'strict'

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

'ignore'

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

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

Значение

Значение

'replace'

Заменяет подходящим маркером замены; для встроенных кодеков Python использует официальный U+FFFD заменяющий символ при декодировании и '?' при кодировании. Реализовано в replace_errors().

'xmlcharrefreplace'

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

'backslashreplace'

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

'namereplace'

Заменяет escape-последовательностями \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 будет вызываться во время кодирования и декодирования в случае ошибки, когда в качестве параметра errors указано name.

При кодировании error_handler будет вызываться с экземпляром UnicodeEncodeError, который содержит информацию о местоположении ошибки. Обработчик ошибок должен либо повторно выбросить это или другое исключение, либо вернуть кортеж с заменой для некодируемой части входных данных и позицией, с которой следует продолжить кодирование. Замена может быть либо str, либо bytes. Если замена – 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.

Кодирование и декодирование без сохранения состоянияStateless Encoding and Decoding

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

Codec.encode(input[, errors])

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

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

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

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

Codec.decode(input[, errors])

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

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

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

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

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

Инкрементальное кодирование и декодированиеIncremental Encoding and Decoding

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

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

Объекты IncrementalEncoderIncrementalEncoder Objects

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

class codecs.IncrementalEncoder(errors='strict')

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

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

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

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

encode(object[, final])

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

reset()

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

getstate()

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

setstate(state)

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

Объекты IncrementalDecoderIncrementalDecoder Objects

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

class codecs.IncrementalDecoder(errors='strict')

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

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

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

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

decode(object[, final])

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

reset()

Сбрасывает декодер в исходное состояние.

getstate()

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

setstate(state)

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

Потоковое кодирование и декодированиеStream Encoding and Decoding

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

Объекты StreamWriterStreamWriter Objects

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

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

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

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

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

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

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

write(object)

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

writelines(list)

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

reset()

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

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

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

Объекты StreamReaderStreamReader Objects

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

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

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

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

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

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

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

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

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

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

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

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

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

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

readline([size[, keepends]])

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

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

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

readlines([sizehint[, keepends]])

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

Символы конца строки обрабатываются с помощью метода decode() кодекa и включаются в элементы списка, если keepends равен True.

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

reset()

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

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

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

Объекты StreamReaderWriterStreamReaderWriter Objects

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

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

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

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

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

Объекты StreamRecoderStreamRecoder Objects

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

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

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

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

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

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

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

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

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

Кодировки и UnicodeEncodings and Unicode

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

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

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

Все эти кодировки могут кодировать только 256 из 1 114 112 кодовых точек, определённых в Unicode. Простой и прямой способ хранить каждую кодовую точку Unicode – хранить каждую кодовую точку в виде четырёх последовательных байтов. Есть две возможности: хранить байты в порядке big endian или little endian. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток в том, что если, например, использовать UTF-32-BE на машине с little endian, то при кодировании и декодировании придётся всегда менять порядок байтов. UTF-32 избегает этой проблемы: байты всегда будут в естественном порядке байтов. Однако когда эти байты читаются процессором с другим порядком байтов, байты всё равно приходится переставлять. Чтобы можно было определить порядок байтов последовательности UTF-16 или UTF-32, существует так называемая BOM («метка порядка байтов»). Это символ 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-00000000U-0000007F

0xxxxxxx

U-00000080U-000007FF

110xxxxx 10xxxxxx

U-00000800U-0000FFFF

1110xxxx 10xxxxxx 10xxxxxx

U-00010000U-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") для своей программы Notepad: перед записью любого символа Unicode в файл записывается BOM в кодировке UTF-8 (которая выглядит как последовательность байтов: 0xef, 0xbb, 0xbf). Поскольку маловероятно, что какой-либо файл, закодированный в charmap, начинается с этих значений байтов (которые, например, отображаются на

ЛАТИНСКАЯ СТРОЧНАЯ БУКВА I С ДИЭРЕЗИСОМ
ПРАВАЯ ДВОЙНАЯ УГЛОВАЯ КАВЫЧКА
ПЕРЕВЁРНУТЫЙ ВОПРОСИТЕЛЬНЫЙ ЗНАК

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

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

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.

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

  • набор символов 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, корейский, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001

Корейский

gb2312

китайский, 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, кириллица

болгарский, белорусский, македонский, русский, сербский

iso8859_6

iso-8859-6, арабский

Арабский

iso8859_7

iso-8859-7, греческий, greek8

Греческий

iso8859_8

iso-8859-8, иврит

Иврит

iso8859_9

iso-8859-9, latin5, L5

Турецкий

iso8859_10

iso-8859-10, latin6, L6

Скандинавские языки

iso8859_11

iso-8859-11, тайская

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

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+D800U+DFFF). Декодировщики utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.

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

Специфичные для Python кодировкиPython Specific Encodings

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

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

Следующие кодеки обеспечивают кодирование из 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 для остальных кодовых точек. Существующие обратные слеши никак не экранируются. Используется в протоколе pickle языка Python.

undefined

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

unicode_escape

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

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

Двоичные преобразованияBinary Transforms

Следующие кодеки обеспечивают двоичные преобразования: объект, подобный байтовой строке в 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' также принимает экземпляры str только с ASCII для декодирования

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

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

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

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

Кодек

Псевдонимы

Значение

rot_13

rot13

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

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

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

encodings.idna – Интернационализированные доменные имена в приложенияхencodings.idna – Internationalized Domain Names in Applications

Этот модуль реализует RFC 3490 (Internationalized Domain Names in Applications) и RFC 3492 (Nameprep: профиль Stringprep для интернационализированных доменных имен (IDN)). Он основан на кодировке punycode и stringprep.

Если требуется стандарт IDNA 2008 из RFC 5891 и RFC 5895, используйте сторонний модуль idna <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, так что приложениям не нужно беспокоиться о преобразовании имён хостов самостоятельно при передаче их в модуль socket. Вдобавок, модули, которые принимают имена хостов в качестве параметров функций, такие как http.client и ftplib, принимают Unicode-имена хостов (http.client затем также прозрачно отправляет IDNA-имя хоста в поле Host, если вообще отправляет это поле).

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

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

encodings.idna.nameprep(label)

Возвращает версию label после обработки nameprep. В текущей реализации предполагаются строки запроса, поэтому AllowUnassigned имеет значение истина.

encodings.idna.ToASCII(label)

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

encodings.idna.ToUnicode(label)

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

encodings.mbcs – кодовая страница Windows ANSIencodings.mbcs – Windows ANSI codepage

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

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

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

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

encodings.utf_8_sig – UTF-8 кодек с сигнатурой BOMencodings.utf_8_sig – UTF-8 codec with BOM signature

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