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, что означает, что будет использоваться размер буфера по умолчанию.Изменено в версии 3.11: Режим
'U'был удалён.
-
codecs.EncodedFile(file, data_encoding, file_encoding=None, errors='strict') -
Возвращает экземпляр
StreamRecoder, обёртку над файлом, которая обеспечивает прозрачное преобразование кодировок. Исходный файл закрывается при закрытии обёртки.Данные, записываемые в обёрнутый файл, декодируются в соответствии с заданной data_encoding и затем записываются в исходный файл в виде байтов с использованием file_encoding. Байты, считываемые из исходного файла, декодируются в соответствии с file_encoding, а результат кодируется с помощью data_encoding.
Если file_encoding не указан, он по умолчанию равен data_encoding.
ошибки могут быть заданы для определения обработки ошибок. По умолчанию значение равно
'strict', которое вызываетValueErrorв случае возникновения ошибки кодирования.
-
codecs.iterencode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементный кодер для итеративного кодирования ввода, предоставляемого итератором. Эта функция является генератором. Аргумент ошибки (а также любые другие ключевые аргументы) передаются инкременному кодеру.
Эта функция требует, чтобы кодек принимал объекты текста
strдля кодирования. Поэтому она не поддерживает кодировщики байты-в-байты, такие какbase64_codec.
-
codecs.iterdecode(iterator, encoding, errors='strict', **kwargs) -
Использует инкрементный декодер для итеративного декодирования ввода, предоставляемого итератором. Эта функция является генератором. Аргумент ошибки (а также любые другие ключевые аргументы) передаются инкременному декодеру.
Эта функция требует, чтобы кодек принимал объекты
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. Например, немецкая строчная буква'ß'будет преобразована в последовательность байтов\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 и определяет следующие методы, которые должен определить каждый объект StreamWriter для совместимости с реестром кодеков Python.
-
class codecs.StreamWriter(stream, errors='strict') -
Конструктор объекта
StreamWriter.Все объекты StreamWriter должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только определённые здесь используются реестром кодеков Python.
Аргумент stream должен быть объектом типа «подобный файлу», открытым для записи текстовых или бинарных данных, соответствующих конкретному кодеку.
Объект
StreamWriterможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Смотрите Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать базовый кодек потока.Аргумент errors будет назначен атрибуту с таким же именем. Назначение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время работы объекта
StreamWriter.-
write(object) -
Записывает закодированное содержимое объекта в поток.
-
writelines(list) -
Записывает конкатенированную итерируемую последовательность строк в поток (возможно, повторно используя метод
write()). Бесконечные или очень большие итерируемые последовательности не поддерживаются. Стандартные кодеки байты-в-байты не поддерживают этот метод.
-
reset() -
Сбрасывает буферы кодека, используемые для сохранения внутреннего состояния.
Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, что позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.
-
Помимо перечисленных методов, StreamWriter должен также унаследовать все другие методы и атрибуты от базового потока.
Объекты StreamReader
Класс StreamReader является подклассом Codec и определяет следующие методы, которые должен определить каждый объект StreamReader для совместимости с реестром кодеков Python.
-
class codecs.StreamReader(stream, errors='strict') -
Конструктор объекта
StreamReader.Все объекты 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).
Существует ещё одна группа кодировок (так называемые кодировки символьных наборов), которые выбирают другой подмножество всех кодовых точек 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.
Без внешней информации невозможно надёжно определить, какая кодировка была использована для кодирования строки. Каждая кодировка символьных наборов может декодировать любую случайную последовательность байтов. Однако это невозможно с UTF-8, так как последовательности байтов UTF-8 имеют структуру, не позволяющую произвольных последовательностей байтов. Для повышения надёжности определения кодировки UTF-8 Microsoft разработала вариант UTF-8 (который Python называет "utf-8-sig") для своей программы Блокнот: перед записью любого символа Unicode в файл записывается закодированный в UTF-8 BOM (который выглядит так в виде последовательности байтов: 0xef, 0xbb, 0xbf). Так как маловероятно, что любой файл, закодированный в символьных наборах, начинается с этих значений байтов (которые, например, отображаются в
в 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 и так далее. Это преобразование выполняется в приложении; по возможности, незаметно для пользователя: приложение должно прозрачно преобразовывать метки 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 — Кодировка ANSI Windows
Этот модуль реализует кодировку 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.11/library/codecs.html