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', что означает открытие файла в режиме чтения.Примечание
Если encoding не
None, то основанные на кодировании файлы всегда открываются в двоичном режиме. Автоматическое преобразование'\n'при чтении и записи не выполняется. Аргумент mode может быть любым двоичным режимом, приемлемым для встроенной функцииopen();'b'добавляется автоматически.encoding указывает кодировку, которая должна использоваться для файла. Допускается любая кодировка, которая кодирует и декодирует байты, и типы данных, поддерживаемые методами файла, зависят от используемого кодека.
errors может быть задан для определения обработки ошибок. По умолчанию это
'strict', что вызываетValueErrorв случае возникновения ошибки кодирования.buffering имеет то же значение, что и для встроенной функции
open(). По умолчанию значение — -1, что означает использование размера буфера по умолчанию.Изменено в версии 3.11: Режим
'U'удален.
-
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_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 Стандартные кодировки:
Значение | Значение |
|---|---|
| Вызвать |
| Проигнорировать некорректные данные и продолжить без дальнейших сообщений. Реализовано в |
| Заменить маркером замены. При кодировании использовать |
| Заменить обратной косой чертой и последовательностью эскейпов. При кодировании использовать шестнадцатеричный вид кодового значения Unicode с форматами |
| При декодировании заменить байт отдельным суррогатным кодом, диапазон которого от |
Следующие обработчики ошибок применимы только к кодированию (в рамках кодировок текста):
Значение | Значение |
|---|---|
| Заменить числовым символом ссылки XML/HTML, который представляет собой десятичный вид кодового значения Unicode с форматом |
| Заменить |
Кроме того, следующий обработчик ошибок специфичен для заданных кодеков:
Значение | Кодеки | Значение |
|---|---|---|
| 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'.Некорректные данные заменяются последовательностью эскейпов с обратной косой чертой. При кодировании используется шестнадцатеричный вид кодового значения Unicode с форматами
\xhh\uxxxx\Uxxxxxxxx. При декодировании используется шестнадцатеричный вид кодового значения байта с форматом\xhh.Изменено в версии 3.5: Работает с декодированием и переводом.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только для кодирования в рамках кодировки текста).Некодируемый символ заменяется соответствующей числовой ссылкой символа XML/HTML, которая представляет собой десятичный вид кодового значения Unicode с форматом
&#num;.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только для кодирования в рамках кодировки текста).Некодируемый символ заменяется последовательностью эскейпов
\N{...}. Набор символов, которые отображаются в фигурных скобках, является свойством Name из базы данных Unicode Character. Например, немецкая строчная буква'ß'будет преобразована в последовательность байтов\N{LATIN SMALL LETTER SHARP S}.Добавлен в версии 3.5.
Бессостояние кодирование и декодирование
Базовый класс Codec определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодировщика и декодировщика:
-
class codecs.Codec -
-
encode(input, errors='strict') -
Кодирует объект input и возвращает кортеж (объект output, длина потребленного ввода). Например, кодирование текста преобразует строковый объект в байтовый объект с использованием кодировки набора символов (например,
cp1252илиiso-8859-1).Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен сохранять состояние в экземпляре
Codec. ИспользуйтеStreamWriterдля кодеков, которым необходимо хранить состояние для повышения эффективности кодирования.Кодировщик должен уметь обрабатывать входной объект длиной ноль и возвращать пустой объект соответствующего типа выходного объекта в такой ситуации.
-
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 ложно, окончания строк будут удалены из возвращаемых строк.
-
readlines(sizehint=None, keepends=True) -
Читает все доступные строки из входного потока и возвращает их в виде списка строк.
Окончания строк реализуются с помощью метода кодека
decode()и включаются в записи списка, если keepends истинно.sizehint, если указан, передаётся в качестве аргумента size методу чтения потока
read().
-
reset() -
Сбрасывает буферы кодека, используемые для хранения внутреннего состояния.
Обратите внимание, что перепозиционирование потока не должно происходить. Этот метод предназначен в первую очередь для восстановления после ошибок декодирования.
-
В дополнение к вышеперечисленным методам, StreamReader также должен наследовать все другие методы и атрибуты от основного потока.
Объекты StreamReaderWriter
Класс StreamReaderWriter — это удобный класс, который позволяет оборачивать потоки, работающие в режимах чтения и записи.
Разработка такова, что можно использовать функции-фабрики, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamReaderWriter. stream должен быть объектом типа «подобный файлу». Reader и Writer должны быть функциями-фабриками или классами, предоставляющими интерфейсStreamReaderиStreamWriterсоответственно. Обработка ошибок выполняется так же, как определено для объектов чтения и записи потоков.
Экземпляры StreamReaderWriter определяют объединённый интерфейс классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от основного потока.
Объекты StreamRecoder
Класс StreamRecoder преобразует данные из одного кодирования в другое, что может быть полезно при работе с различными кодировками.
Для создания экземпляра можно использовать фабричные функции, возвращаемые функцией lookup().
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamRecoder, реализующий двустороннее преобразование: методы encode и decode работают на фронте — данные, видимые кодом, вызывающимread()иwrite(), а методы Reader и Writer работают на бэкенде — данные в stream.Эти объекты можно использовать для прозрачного преобразования кодировок, например, из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть объектом, подобным файлу.
Аргументы encode и decode должны соответствовать интерфейсу
Codec. Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты интерфейсаStreamReaderиStreamWriterсоответственно.Обработка ошибок выполняется так же, как и для читателей и писателей потоков.
Экземпляры StreamRecoder определяют объединённый интерфейс классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты от основного потока.
Кодировки и Unicode
Строки хранятся внутри как последовательности кодовых точек в диапазоне 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 является хранение каждой кодовой точки в виде четырех последовательных байтов. Есть два варианта: хранить байты в порядке big endian или little endian. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостаток заключается в том, что если, например, вы используете UTF-32-BE на машине с порядком байтов little endian, вам всегда нужно будет менять байты при кодировании и декодировании. 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, windows-31j | Японский |
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. |
Добавлена в версии 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 и так далее. Это преобразование выполняется в приложении; по возможности, незаметно для пользователя: Приложение должно прозрачно преобразовывать метки доменных имён 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. В настоящее время реализация предполагает строки запросов, поэтому
AllowUnassignedравно true.
-
encodings.idna.ToASCII(label) -
Преобразует метку в ASCII, как указано в RFC 3490.
UseSTD3ASCIIRulesпредполагается равным false.
-
encodings.idna.ToUnicode(label) -
Преобразует метку в Unicode, как указано в RFC 3490.
encodings.mbcs — Кодировка Windows ANSI
Этот модуль реализует кодировку ANSI (CP_ACP).
Доступность: Windows.
Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace' всегда использовался для кодирования, а 'ignore' для декодирования.
Изменено в версии 3.3: Поддержка любого обработчика ошибок.
encodings.utf_8_sig — Кодировка UTF-8 с сигнатурой BOM
Этот модуль реализует вариант кодировки UTF-8. При кодировании в начало кодированных байтов UTF-8 будет добавлен BOM UTF-8. Для состоятельного кодера это выполняется только один раз (при первом записи в поток байтов). При декодировании необязательная BOM UTF-8 в начале данных будет пропущена.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/codecs.html