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.Изменено в версии 3.9: Дефисы и пробелы преобразуются в символы нижнего подчеркивания.
-
codecs.unregister(search_function) -
Дерегистрирует функцию поиска кодеков и очищает кэш реестра. Если функция поиска не зарегистрирована, ничего не происходит.
Введено в версии 3.10.
Хотя встроенная функция open() и связанный модуль io являются рекомендуемым подходом для работы с закодированными текстовыми файлами, этот модуль предоставляет дополнительные утилитарные функции и классы, которые позволяют использовать более широкий спектр кодеков при работе с бинарными файлами:
-
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=- 1) -
Открытие закодированного файла с заданным режимом и возврат экземпляра
StreamReaderWriter, обеспечивающего прозрачное кодирование/декодирование. По умолчанию режим файла равен'r', что означает открытие файла в режиме чтения.Примечание
Если кодировка не
None, то основанные на кодировании файлы всегда открываются в двоичном режиме. Автоматическое преобразование'\n'при чтении и записи не выполняется. Аргумент режим может быть любым двоичным режимом, приемлемым для встроенной функцииopen();'b'добавляется автоматически.кодировка определяет кодировку, которая будет использоваться для файла. Допускается любая кодировка, которая кодирует и декодирует байты, а типы данных, поддерживаемые методами файла, зависят от используемого кодека.
ошибки могут быть заданы для определения обработки ошибок. По умолчанию используется
'strict', что приводит к возбуждениюValueErrorв случае возникновения ошибки кодирования.буферизация имеет то же значение, что и для встроенной функции
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.
ошибки могут быть заданы для определения обработки ошибок. По умолчанию используется
'strict', что приводит к возбуждениюValueErrorв случае возникновения ошибки кодирования.
-
codecs.iterencode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементальный кодировщик для итеративного кодирования входных данных, предоставляемых iterator. Эта функция является генератором. Аргумент ошибки (а также любой другой ключевой аргумент) передаётся инкрементальному кодировщику.
Эта функция требует, чтобы кодек принимал текстовые объекты
strдля кодирования. Поэтому она не поддерживает кодировщики байты-в-байты, такие какbase64_codec.
-
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементальный декодер для итеративного декодирования входных данных, предоставляемых iterator. Эта функция является генератором. Аргумент ошибки (а также любой другой ключевой аргумент) передаётся инкрементальному декодеру.
Эта функция требует, чтобы кодек принимал объекты
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_LEдляBOM_UTF16_LEиBOM_BEдляBOM_UTF16_BE. Остальные представляют BOM в кодировках UTF-8 и UTF-32.
Базовые классы кодеков
Модуль codecs определяет набор базовых классов, которые задают интерфейсы для работы с объектами кодеков и могут быть использованы в качестве основы для реализации пользовательских кодеков.
Каждый кодек должен определить четыре интерфейса, чтобы быть применимым в качестве кодека в Python: бессостоятельный кодировщик, бессостоятельный декодер, потоковый читатель и потоковый писатель. Потоковый читатель и писатели обычно повторно используют бессостоятельного кодировщика/декодера для реализации протоколов файлов. Авторы кодеков также должны определить, как кодек будет обрабатывать ошибки кодирования и декодирования.
Обработчики ошибок
Для упрощения и стандартизации обработки ошибок кодеки могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors:
>>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace') b'German \\xdf, \\u266c' >>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace') b'German ß, ♬'
Следующие обработчики ошибок могут использоваться со всеми кодеками стандартных кодировок Python Стандартные кодировки:
Значение | Значение |
|---|---|
| Вызвать |
| Проигнорировать некорректные данные и продолжить без дальнейших уведомлений. Реализовано в |
| Заменить маркером замены. При кодировании использовать |
| Заменить обратными слешами, которые ссылаются на последовательности. При кодировании использовать шестнадцатеричную форму кодового значения Юникода в формате |
| При декодировании заменить байт отдельным суррогатным кодом, изменяющимся от |
Следующие обработчики ошибок применимы только к кодированию (внутри кодировок текста):
Значение | Значение |
|---|---|
| Заменить числовым указателем символа XML/HTML, который представляет собой десятичную форму кодового значения Юникода в формате |
| Заменить |
Кроме того, следующий обработчик ошибок специфичен для заданных кодеков:
Значение | Кодеки | Значение |
|---|---|---|
| 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.ignore_errors(exception) -
Реализует обработку ошибок
'ignore'.Некорректные данные игнорируются; кодирование или декодирование продолжаются без дальнейших уведомлений.
-
codecs.replace_errors(exception) -
Реализует обработку ошибок
'replace'.Заменяет
?(символ ASCII) при ошибках кодирования или�(U+FFFD, официальный СИМВОЛ ЗАМЕНЫ) при ошибках декодирования.
-
codecs.backslashreplace_errors(exception) -
Реализует обработку ошибок
'backslashreplace'.Некорректные данные заменяются обратной слешей, которая ссылается на последовательность. При кодировании использовать шестнадцатеричную форму кодового значения Юникода в формате
\xhh\uxxxx\Uxxxxxxxx. При декодировании использовать шестнадцатеричную форму значения байта в формате\xhh.Изменено в версии 3.5: Работает с декодированием и преобразованием.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только для кодирования в кодировке текста).Некодируемый символ заменяется соответствующей числовой ссылкой XML/HTML, которая представляет собой десятичную форму кодового значения Юникода в формате
&#num;.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только для кодирования в кодировке текста).Некодируемый символ заменяется на
\N{...}последовательность обратных ссылок. Множество символов, которые появляются в фигурных скобках, представляет собой свойство имени из базы данных символов Юникода. Например, немецкая строчная буква'ß'будет преобразована в последовательность байтов\N{LATIN SMALL LETTER SHARP S}.Добавлено в версии 3.5.
Бессостоятельные кодирование и декодирование
Базовый Codec класс определяет эти методы, которые также определяют интерфейсы функций бессостоятельного кодировщика и декодировщика:
-
Codec.encode(input, errors='strict') -
Кодирует объект input и возвращает кортеж (объект output, длина потреблённых данных). Например, кодирование текста преобразует строковый объект в байтовый объект, используя кодировку набора символов (например,
cp1252илиiso-8859-1).Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен хранить состояние в экземпляре
Codec. ИспользуйтеStreamWriterдля кодеков, которым необходимо хранить состояние для повышения эффективности кодирования.Кодировщик должен уметь обрабатывать входной объект нулевой длины и возвращать пустой объект типа выходного объекта в такой ситуации.
-
Codec.decode(input, errors='strict') -
Декодирует объект input и возвращает кортеж (объект output, длина потреблённых данных). Например, для кодирования текста декодирование преобразует байтовый объект, закодированный с помощью определённой кодировки набора символов, в строковый объект.
Для кодировок текста и кодеков байты-в-байты 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=False) -
Кодирует 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=False) -
Декодирует 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=- 1, chars=- 1, firstline=False) -
Декодирует данные из потока и возвращает результирующий объект.
Аргумент chars указывает количество декодированных кодовых точек или байтов, которые нужно вернуть. Метод
read()никогда не вернёт больше данных, чем запрошено, но он может вернуть меньше, если их недостаточно.Аргумент size указывает приблизительное максимальное количество закодированных байтов или кодовых точек для чтения при декодировании. Декодер может изменить это значение по мере необходимости. Значение по умолчанию -1 указывает на чтение и декодирование максимально возможного объёма. Этот параметр предназначен для предотвращения декодирования огромных файлов за один шаг.
Флаг firstline указывает, что достаточно будет вернуть только первую строку, если есть ошибки декодирования в последующих строках.
Метод должен использовать жадную стратегию чтения, что означает, что он должен читать столько данных, сколько разрешено в соответствии с определением кодировки и заданным размером, например, если необязательные кодировочные окончания или маркеры состояния доступны в потоке, они также должны быть прочитаны.
-
readline(size=None, keepends=True) -
Читает одну строку из входного потока и возвращает декодированные данные.
size, если задан, передаётся в качестве аргумента size методу
read()потока.Если keepends равен false, окончания строк будут удалены из возвращаемых строк.
-
readlines(sizehint=None, keepends=True) -
Читает все доступные строки из входного потока и возвращает их в виде списка строк.
Окончания строк реализуются с помощью метода кодека
decode()и включаются в записи списка, если keepends имеет значение true.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
Строки хранятся в виде последовательности кодовых точек в диапазоне U+0000–U+10FFFF. (См. 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):
Диапазон | Кодировка |
|---|---|
| 0xxxxxxx |
| 110xxxxx 10xxxxxx |
| 1110xxxx 10xxxxxx 10xxxxxx |
| 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 называет "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_centeuro | Центральная и Восточная Европа |
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, см. также | |
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 с | |
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 (результат всегда включает конечный Изменено в версии 3.4: принимает любой объект-подобный байтам в качестве входных данных для кодирования и декодирования | |
bz2_codec | bz2 | Сжать операнд с помощью bz2. | |
hex_codec | hex | Преобразовать операнд в шестнадцатеричное представление, с двумя цифрами на байт. | |
quopri_codec | quopri, quotedprintable, quoted_printable | Преобразовать операнд в MIME quoted printable. |
|
uu_codec | uu | Преобразовать операнд с помощью uuencode. | |
zlib_codec | zip, zlib | Сжать операнд с помощью gzip. |
-
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.
Эти RFC вместе определяют протокол для поддержки символов, отличных от ASCII, в именах доменных имён. Имя доменного имени, содержащее символы, отличные от ASCII (например, www.Alliancefrançaise.nu), преобразуется в кодировку, совместимую с ASCII (ACE, например, www.xn--alliancefranaise-npb.nu). Форма ACE имени доменного имени затем используется во всех местах, где произвольные символы не допускаются протоколом, например, в запросах DNS, полях HTTP Host и так далее. Это преобразование выполняется в приложении; по возможности, незаметно для пользователя: приложение должно прозрачно преобразовывать метки доменных имён Юникода в IDNA в сети и преобразовывать метки ACE обратно в Юникод перед представлением их пользователю.
Python поддерживает это преобразование несколькими способами: кодек idna выполняет преобразование между Юникодом и ACE, разбивая входную строку на метки на основе разделителей, определённых в разделе 3.1 RFC 3490, и преобразует каждую метку в ACE по мере необходимости, а также разбивает входную строку байтов на метки на основе . разделителя и преобразует найденные метки ACE в Юникод. Кроме того, модуль socket прозрачно преобразует имена хостов Юникода в ACE, так что приложениям не нужно беспокоиться о преобразовании имён хостов при передаче их модулю socket. Кроме того, модули, имеющие имена хостов в качестве параметров функций, такие как http.client и ftplib, принимают имена хостов Юникода (http.client затем также прозрачно отправляет имя хоста IDNA в поле Host, если отправляет это поле вообще).
При получении имён хостов из сети (например, при обратном поиске имён) автоматическое преобразование в Юникод не выполняется: приложения, желающие представить такие имена хостов пользователю, должны декодировать их в Юникод.
Модуль encodings.idna также реализует процедуру nameprep, которая выполняет определённые нормализации имён хостов для обеспечения регистронезависимости международных доменных имён и объединения похожих символов. Функции nameprep можно использовать непосредственно, если это необходимо.
-
encodings.idna.nameprep(label) -
Возвращает версию label, обработанную nameprep. В настоящее время реализация предполагает строки запроса, поэтому
AllowUnassignedравно true.
-
encodings.idna.ToASCII(label) -
Преобразует метку в ASCII, как указано в RFC 3490. Предполагается, что
UseSTD3ASCIIRulesравно false.
-
encodings.idna.ToUnicode(label) -
Преобразует метку в Юникод, как указано в 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/codecs.html