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) -
Открывает файл в заданной кодировке, используя указанный mode, и возвращает экземпляр
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 для стандартных кодировок можно использовать следующие обработчики ошибок:
Значение | Значение |
|---|---|
| Вызвать исключение |
| Игнорировать некорректные данные и продолжить работу без дополнительных уведомлений. Реализовано в |
| Заменить маркером замены. При кодировании использовать |
| Заменить escape-последовательностями с обратной косой чертой. При кодировании использовать шестнадцатеричную форму кодовой точки Юникода в форматах |
| При декодировании заменить байт отдельной суррогатной кодовой точкой из диапазона от |
Следующие обработчики ошибок применимы только к кодированию (в текстовых кодировках):
Значение | Значение |
|---|---|
| Заменить числовой символьной ссылкой XML/HTML, представляющей собой десятичную форму кодовой точки Юникода в формате |
| Заменить escape-последовательностями |
Кроме того, для указанных ниже кодеков предусмотрен следующий специальный обработчик ошибок:
Значение | Кодеки | Значение |
|---|---|---|
| utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le | Разрешить кодирование и декодирование суррогатных кодовых точек ( |
Добавлено в версии 3.1: Обработчики ошибок 'surrogateescape' и 'surrogatepass'.
Изменено в версии 3.4: Обработчик ошибок 'surrogatepass' теперь работает с кодеками utf-16* и utf-32*.
Добавлено в версии 3.5: Обработчик ошибок 'namereplace'.
Изменено в версии 3.5: Обработчик ошибок 'backslashreplace' теперь работает при декодировании и преобразовании.
Набор допустимых значений можно расширить, зарегистрировав новый именованный обработчик ошибок:
-
codecs.register_error(name, error_handler) -
Зарегистрировать функцию обработки ошибок error_handler под именем name. Аргумент error_handler будет передаваться при кодировании и декодировании в случае ошибки, если в качестве параметра errors указано значение name.
При кодировании функция error_handler будет вызвана с экземпляром
UnicodeEncodeError, содержащим сведения о месте возникновения ошибки. Обработчик ошибок должен либо вызвать это или другое исключение, либо вернуть кортеж с заменой для некодируемой части входных данных и позицией, с которой следует продолжить кодирование. Заменой может бытьstrилиbytes. Если замена представляет собой байты, кодировщик просто скопирует их в выходной буфер. Если замена представляет собой строку, кодировщик закодирует её. Кодирование продолжается с указанной позиции исходных входных данных. Отрицательные значения позиции рассматриваются как смещение относительно конца входной строки. Если полученная позиция выходит за границы, будет вызвано исключение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'.Некорректные данные заменяются escape-последовательностью с обратной косой чертой. При кодировании используется шестнадцатеричная форма кодовой точки Юникода в форматах
\xhh\uxxxx\Uxxxxxxxx. При декодировании используется шестнадцатеричная форма значения байта в формате\xhh.Изменено в версии 3.5: Работает при декодировании и преобразовании.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только при кодировании в текстовой кодировке).Некодируемый символ заменяется соответствующей числовой символьной ссылкой XML/HTML, представляющей собой десятичную форму кодовой точки Юникода в формате
&#num;.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только при кодировании в текстовой кодировке).Некодируемый символ заменяется escape-последовательностью
\N{...}. Набор символов в фигурных скобках представляет собой свойство Name из базы данных символов Юникода. Например, строчная немецкая буква'ß'будет преобразована в последовательность байтов\N{LATIN SMALL LETTER SHARP S}.Добавлено в версии 3.5.
Кодирование и декодирование без сохранения состояния
Базовый класс Codec определяет следующие методы, которые также задают интерфейсы функций кодировщика и декодера без сохранения состояния:
-
class codecs.Codec -
-
encode(input, errors='strict') -
Кодирует объект input и возвращает кортеж (выходной объект, число обработанных элементов). Например, текстовое кодирование преобразует строковый объект в байтовый объект с использованием определённой кодировки набора символов (например,
cp1252илиiso-8859-1).Аргумент errors задаёт применяемую обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен сохранять состояние в экземпляре
Codec. Для кодеков, которым необходимо сохранять состояние для эффективного кодирования, используйтеStreamWriter.Кодировщик должен уметь обрабатывать входные данные нулевой длины и в этом случае возвращать пустой объект выходного типа.
-
decode(input, errors='strict') -
Декодирует объект input и возвращает кортеж (выходной объект, число обработанных элементов). Например, для текстовой кодировки декодирование преобразует байтовый объект, закодированный с помощью определённой кодировки набора символов, в строковый объект.
Для текстовых кодировок и кодеков преобразования байтов в байты аргумент input должен быть байтовым объектом или объектом, предоставляющим интерфейс буфера только для чтения, например объектом-буфером или файлом, отображённым в память.
Аргумент errors задаёт применяемую обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен сохранять состояние в экземпляре
Codec. Для кодеков, которым необходимо сохранять состояние для эффективного декодирования, используйтеStreamReader.Декодер должен уметь обрабатывать входные данные нулевой длины и в этом случае возвращать пустой объект выходного типа.
-
Инкрементальное кодирование и декодирование
Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементального кодирования и декодирования. Кодирование/декодирование входных данных выполняется не одним вызовом функции кодировщика/декодера без сохранения состояния, а несколькими вызовами метода encode()/decode() инкрементального кодировщика/декодера. Инкрементальный кодировщик/декодер отслеживает ход процесса кодирования/декодирования между вызовами методов.
Объединённые результаты вызовов метода encode()/decode() совпадают с результатом кодирования/декодирования одного входного объекта, полученного объединением всех отдельных входных данных, с помощью кодировщика/декодера без сохранения состояния.
Объекты IncrementalEncoder
Класс IncrementalEncoder используется для кодирования входных данных в несколько этапов. Он определяет следующие методы, которые должен реализовать каждый инкрементальный кодировщик для совместимости с реестром кодеков Python.
-
class codecs.IncrementalEncoder(errors='strict') -
Конструктор экземпляра
IncrementalEncoder.Все инкрементальные кодировщики должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные именованные аргументы, но реестр кодеков Python использует только определённые здесь аргументы.
Класс
IncrementalEncoderможет реализовывать различные схемы обработки ошибок, принимая именованный аргумент errors. Возможные значения см. в разделе Обработчики ошибок.Аргумент errors присваивается атрибуту с тем же именем. Присваивание этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок в течение срока жизни объекта
IncrementalEncoder.-
encode(object, final=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 указывает, что достаточно вернуть только первую строку, если в последующих строках возникают ошибки декодирования.
Метод должен использовать стратегию жадного чтения, то есть считывать столько данных, сколько допускают правила кодировки и заданное значение size. Например, если в потоке доступны необязательные завершающие последовательности кодировки или маркеры состояния, их также следует прочитать.
-
readline(size=None, keepends=True) -
Читает одну строку из входного потока и возвращает декодированные данные.
Если задан аргумент size, он передаётся как аргумент размера методу потока
read().Если значение keepends равно false, символы конца строки удаляются из возвращаемых строк.
-
readlines(sizehint=None, keepends=True) -
Читает все доступные строки из входного потока и возвращает их в виде списка.
Символы конца строки обрабатываются методом кодека
decode()и включаются в элементы списка, если значение keepends равно true.Если задан аргумент sizehint, он передаётся как аргумент size методу потока
read().
-
reset() -
Сбрасывает буферы кодека, используемые для хранения внутреннего состояния.
Обратите внимание: перемещение позиции в потоке выполняться не должно. Этот метод предназначен прежде всего для восстановления после ошибок декодирования.
-
Помимо перечисленных выше методов, класс StreamReader должен также наследовать все остальные методы и атрибуты нижележащего потока.
Объекты StreamReaderWriter
StreamReaderWriter — это вспомогательный класс, позволяющий оборачивать потоки, работающие как в режиме чтения, так и в режиме записи.
Конструкция класса позволяет использовать фабричные функции, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamReaderWriter. Аргумент stream должен быть файловым объектом. Аргументы Reader и Writer должны быть фабричными функциями или классами, предоставляющими интерфейсыStreamReaderиStreamWriterсоответственно. Обработка ошибок выполняется так же, как определено для модулей чтения и записи потоков.
Экземпляры StreamReaderWriter предоставляют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты нижележащего потока.
Объекты StreamRecoder
StreamRecoder преобразует данные из одной кодировки в другую, что иногда полезно при работе с разными средами кодирования.
Конструкция класса позволяет использовать фабричные функции, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors='strict') -
Создаёт экземпляр
StreamRecoder, реализующий двустороннее преобразование: encode и decode работают на внешней стороне — с данными, видимыми коду, вызывающемуread()иwrite(), тогда как Reader и Writer работают на внутренней стороне — с данными в stream.Эти объекты можно использовать для прозрачной перекодировки, например из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть файловым объектом.
Аргументы encode и decode должны соответствовать интерфейсу
Codec. Аргументы Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты с интерфейсамиStreamReaderиStreamWriterсоответственно.Обработка ошибок выполняется так же, как определено для модулей чтения и записи потоков.
Экземпляры StreamRecoder предоставляют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все остальные методы и атрибуты нижележащего потока.
Кодировки и Unicode
Строки хранятся во внутреннем представлении как последовательности кодовых точек в диапазоне U+0000–U+10FFFF. (Подробнее о реализации см. в PEP 393.) Когда объект строки используется вне процессора и памяти, важными становятся порядок байтов и способ хранения этих массивов в виде байтов. Как и в случае с другими кодеками, преобразование строки в последовательность байтов называется кодированием, а восстановление строки из последовательности байтов — декодированием. Существует множество различных кодеков сериализации текста, которые в совокупности называются текстовыми кодировками.
Самая простая текстовая кодировка (называемая 'latin-1' или 'iso-8859-1') сопоставляет кодовые точки 0–255 байтам 0x0–0xff. Это означает, что объект строки, содержащий кодовые точки выше U+00FF, нельзя закодировать с помощью этого кодека. При попытке это сделать возникнет исключение UnicodeEncodeError, которое выглядит следующим образом (хотя подробности сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in
position 3: ordinal not in range(256).
Существует и другая группа кодировок (так называемые кодировки charmap), выбирающих другое подмножество всех кодовых точек Unicode и способ сопоставления этих кодовых точек байтам 0x0–0xff. Чтобы посмотреть, как это устроено, откройте, например, encodings/cp1252.py (кодировку, используемую преимущественно в Windows). Там есть строковая константа из 256 символов, показывающая, какой символ соответствует каждому значению байта.
Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простой и очевидный способ хранения любой кодовой точки Unicode — представлять каждую кодовую точку четырьмя последовательными байтами. Есть два варианта: хранить байты в порядке от старшего к младшему или от младшего к старшему. Эти две кодировки называются соответственно UTF-32-BE и UTF-32-LE. Их недостаток заключается в том, что, например, при использовании UTF-32-BE на машине с порядком байтов от младшего к старшему байты при кодировании и декодировании всегда приходится переставлять. UTF-32 позволяет избежать этой проблемы: байты всегда располагаются в естественном порядке байтов. Однако при чтении этих байтов процессором с другим порядком байтов их всё же приходится переставлять. Чтобы определить порядок байтов в последовательности байтов UTF-16 или UTF-32, используется так называемая BOM («метка порядка байтов»). Это символ 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 состоит из двух частей: битов-маркеров (старших битов) и битов полезной нагрузки. Биты-маркеры представляют собой последовательность из нуля — четырёх битов 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 в файл записывается BOM в кодировке UTF-8 (в виде последовательности байтов: 0xef, 0xbb, 0xbf). Поскольку крайне маловероятно, что файл в кодировке charmap начинается с этих значений байтов (которые, например, соответствовали бы
в iso-8859-1), это повышает вероятность того, что кодировку utf-8-sig удастся правильно определить по последовательности байтов. В данном случае BOM используется не для определения порядка байтов, применённого при создании последовательности, а как сигнатура, помогающая определить кодировку. При кодировании кодек utf-8-sig записывает 0xef, 0xbb, 0xbf в качестве первых трёх байтов файла. При декодировании utf-8-sig пропускает эти три байта, если они стоят в начале файла. В UTF-8 использование BOM не рекомендуется и обычно его следует избегать.
Стандартные кодировки
Python поставляется с рядом встроенных кодеков, реализованных либо в виде функций на C, либо с помощью словарей в качестве таблиц соответствий. В следующей таблице перечислены кодеки по именам, а также несколько распространённых псевдонимов и языки, для которых, вероятно, используется кодировка. Ни список псевдонимов, ни список языков не являются исчерпывающими. Обратите внимание, что варианты написания, различающиеся только регистром или использованием дефиса вместо подчёркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом кодека 'utf_8'.
Деталь реализации CPython: Некоторые распространённые кодировки могут обходить механизм поиска кодеков для повышения производительности. CPython распознаёт эти возможности оптимизации только для ограниченного набора псевдонимов (без учёта регистра): utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (только Windows), ascii, us-ascii, utf-16, utf16, utf-32, utf32, а также тех же вариантов с подчёркиваниями вместо дефисов. Использование альтернативных псевдонимов для этих кодировок может привести к снижению производительности.
Изменено в версии 3.6: Возможность оптимизации распознаётся для us-ascii.
Многие наборы символов поддерживают одни и те же языки. Они различаются отдельными символами (например, поддерживается ли EURO SIGN) и назначением символов позициям кодов. В частности, для европейских языков обычно существуют следующие варианты:
- набор кодов ISO 8859
- кодовая страница Microsoft Windows, обычно производная от набора кодов 8859, но в которой управляющие символы заменены дополнительными графическими символами
- кодовая страница IBM EBCDIC
- кодовая страница IBM PC, совместимая с ASCII
Кодек | Псевдонимы | Языки |
|---|---|---|
ascii | 646, us-ascii | Английский |
big5 | big5-tw, csbig5 | Традиционный китайский |
big5hkscs | big5-hkscs, hkscs | Традиционный китайский |
cp037 | IBM037, IBM039 | Английский |
cp273 | 273, IBM273, csIBM273 |
Немецкий Добавлено в версии 3.4. |
cp424 | EBCDIC-CP-HE, IBM424 | Иврит |
cp437 | 437, IBM437 | Английский |
cp500 | EBCDIC-CP-BE, EBCDIC-CP-CH, IBM500 | Западная Европа |
cp720 | Арабский | |
cp737 | Греческий | |
cp775 | IBM775 | Балтийские языки |
cp850 | 850, IBM850 | Западная Европа |
cp852 | 852, IBM852 | Центральная и Восточная Европа |
cp855 | 855, IBM855 | Болгарский, белорусский, македонский, русский, сербский |
cp856 | Иврит | |
cp857 | 857, IBM857 | Турецкий |
cp858 | 858, IBM858 | Западная Европа |
cp860 | 860, IBM860 | Португальский |
cp861 | 861, CP-IS, IBM861 | Исландский |
cp862 | 862, IBM862 | Иврит |
cp863 | 863, IBM863 | Канадский |
cp864 | IBM864 | Арабский |
cp865 | 865, IBM865 | Датский, норвежский |
cp866 | 866, IBM866 | Русский |
cp869 | 869, CP-GR, IBM869 | Греческий |
cp874 | Тайский | |
cp875 | Греческий | |
cp932 | 932, ms932, mskanji, ms-kanji | Японский |
cp949 | 949, ms949, uhc | Корейский |
cp950 | 950, ms950 | Традиционный китайский |
cp1006 | Урду | |
cp1026 | ibm1026 | Турецкий |
cp1125 | 1125, ibm1125, cp866u, ruscii |
Украинский Добавлено в версии 3.4. |
cp1140 | ibm1140 | Западная Европа |
cp1250 | windows-1250 | Центральная и Восточная Европа |
cp1251 | windows-1251 | Болгарский, белорусский, македонский, русский, сербский |
cp1252 | windows-1252 | Западная Европа |
cp1253 | windows-1253 | Греческий |
cp1254 | windows-1254 | Турецкий |
cp1255 | windows-1255 | Иврит |
cp1256 | windows-1256 | Арабский |
cp1257 | windows-1257 | Балтийские языки |
cp1258 | windows-1258 | Вьетнамский |
euc_jp | eucjp, ujis, u-jis | Японский |
euc_jis_2004 | jisx0213, eucjis2004 | Японский |
euc_jisx0213 | eucjisx0213 | Японский |
euc_kr | euckr, korean, ksc5601, ks_c-5601, ks_c-5601-1987, ksx1001, ks_x-1001 | Корейский |
gb2312 | chinese, csiso58gb231280, euc-cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso-ir-58 | Упрощённый китайский |
gbk | 936, cp936, ms936 | Унифицированный китайский |
gb18030 | gb18030-2000 | Унифицированный китайский |
hz | hzgb, hz-gb, hz-gb-2312 | Упрощённый китайский |
iso2022_jp | csiso2022jp, iso2022jp, iso-2022-jp | Японский |
iso2022_jp_1 | iso2022jp-1, iso-2022-jp-1 | Японский |
iso2022_jp_2 | iso2022jp-2, iso-2022-jp-2 | Японский, корейский, упрощённый китайский, Западная Европа, греческий |
iso2022_jp_2004 | iso2022jp-2004, iso-2022-jp-2004 | Японский |
iso2022_jp_3 | iso2022jp-3, iso-2022-jp-3 | Японский |
iso2022_jp_ext | iso2022jp-ext, iso-2022-jp-ext | Японский |
iso2022_kr | csiso2022kr, iso2022kr, iso-2022-kr | Корейский |
latin_1 | iso-8859-1, iso8859-1, 8859, cp819, latin, latin1, L1 | Западная Европа |
iso8859_2 | iso-8859-2, latin2, L2 | Центральная и Восточная Европа |
iso8859_3 | iso-8859-3, latin3, L3 | Эсперанто, мальтийский |
iso8859_4 | iso-8859-4, latin4, L4 | Балтийские языки |
iso8859_5 | iso-8859-5, cyrillic | Болгарский, белорусский, македонский, русский, сербский |
iso8859_6 | iso-8859-6, arabic | Арабский |
iso8859_7 | iso-8859-7, greek, greek8 | Греческий |
iso8859_8 | iso-8859-8, hebrew | Иврит |
iso8859_9 | iso-8859-9, latin5, L5 | Турецкий |
iso8859_10 | iso-8859-10, latin6, L6 | Скандинавские языки |
iso8859_11 | iso-8859-11, thai | Тайские языки |
iso8859_13 | iso-8859-13, latin7, L7 | Балтийские языки |
iso8859_14 | iso-8859-14, latin8, L8 | Кельтские языки |
iso8859_15 | iso-8859-15, latin9, L9 | Западная Европа |
iso8859_16 | iso-8859-16, latin10, L10 | Юго-Восточная Европа |
johab | cp1361, ms1361 | Корейский |
koi8_r | Русский | |
koi8_t |
Таджикский Добавлено в версии 3.5. | |
koi8_u | Украинский | |
kz1048 | kz_1048, strk1048_2002, rk1048 |
Казахский Добавлено в версии 3.5. |
mac_cyrillic | maccyrillic | Болгарский, белорусский, македонский, русский, сербский |
mac_greek | macgreek | Греческий |
mac_iceland | maciceland | Исландский |
mac_latin2 | maclatin2, maccentraleurope, mac_centeuro | Центральная и Восточная Европа |
mac_roman | macroman, macintosh | Западная Европа |
mac_turkish | macturkish | Турецкий |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | Казахский |
shift_jis | csshiftjis, shiftjis, sjis, s_jis | Японский |
shift_jis_2004 | shiftjis2004, sjis_2004, sjis2004 | Японский |
shift_jisx0213 | shiftjisx0213, sjisx0213, s_jisx0213 | Японский |
utf_32 | U32, utf32 | все языки |
utf_32_be | UTF-32BE | все языки |
utf_32_le | UTF-32LE | все языки |
utf_16 | U16, utf16 | все языки |
utf_16_be | UTF-16BE | все языки |
utf_16_le | UTF-16LE | все языки |
utf_7 | U7, unicode-1-1-utf-7 | все языки |
utf_8 | U8, UTF, utf8, cp65001 | все языки |
utf_8_sig | все языки |
Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не допускают кодирование суррогатных кодовых точек (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.
Изменено в версии 3.8: cp65001 теперь является псевдонимом для utf_8.
Специальные кодировки Python
Ряд предопределённых кодеков специфичен для Python, поэтому их имена не имеют значения за пределами Python. Они перечислены в таблицах ниже в соответствии с ожидаемыми типами входных и выходных данных (обратите внимание: хотя наиболее распространённый вариант использования кодеков — кодирование текста, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только кодирование текста). Для асимметричных кодеков указанное значение описывает направление кодирования.
Кодировки текста
Следующие кодеки обеспечивают кодирование str в bytes и декодирование объекта, подобного 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. Они не поддерживаются методом bytes.decode() (который создаёт только результат типа str).
Кодек | Псевдонимы | Значение | Кодировщик / декодер |
|---|---|---|---|
base64_codec [1] | base64, base_64 |
Преобразует операнд в многострочный MIME base64 (результат всегда содержит завершающий Изменено в версии 3.4: принимает любой объект, подобный bytes, в качестве входных данных для кодирования и декодирования | |
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, обработанную процедурой nameprep. Текущая реализация предполагает, что это строки запроса, поэтому
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.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.11/library/codecs.html