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.Примечание
Регистрация функций поиска в настоящее время необратима, что может вызвать проблемы в некоторых случаях, таких как тестирование или перезагрузка модулей.
В то время как встроенная функция open() и ассоциированный модуль io являются рекомендуемым подходом для работы с закодированными текстовыми файлами, этот модуль предоставляет дополнительные служебные функции и классы, которые позволяют использовать более широкий спектр кодеков при работе с двоичными файлами:
-
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1) -
Открывает закодированный файл с заданным mode и возвращает экземпляр
StreamReaderWriter, обеспечивая прозрачное кодирование/декодирование. Режим файла по умолчанию'r', что означает открытие файла в режиме чтения.Примечание
Подлежащие закодированные файлы всегда открываются в двоичном режиме. Автоматическое преобразование
'\n'не выполняется при чтении и записи. Аргумент mode может быть любым двоичным режимом, допустимым для встроенной функцииopen();'b'добавляется автоматически.encoding задает кодировку, которая должна использоваться для файла. Допускается любая кодировка, которая кодирует и декодирует байты, а типы данных, поддерживаемые методами файла, зависят от используемого кодека.
errors могут быть заданы для определения обработки ошибок. По умолчанию
'strict', что приводит кValueErrorв случае возникновения ошибки кодирования.buffering имеет то же значение, что и для встроенной функции
open(). По умолчанию буферизация по строкам.
-
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 -
Эти константы определяют различные последовательности байтов, являющиеся метками порядка байтов Юникода (BOM) для нескольких кодировок. Они используются в потоках данных UTF-16 и UTF-32 для указания порядка байтов, используемого, и в UTF-8 в качестве подписи Юникода.
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.
1. Классы-базы кодеков
Модуль codecs определяет набор базовых классов, которые определяют интерфейсы для работы с объектами кодеков и также могут быть использованы в качестве основы для реализации пользовательских кодеков.
Каждый кодек должен определить четыре интерфейса, чтобы сделать его пригодным в качестве кодека в Python: бессостояние кодировщик, бессостояние декодировщик, поток читатель и поток писатель. Поток читатель и писатели обычно повторно используют бессостояние кодировщик/декодировщик для реализации протоколов файлов. Авторы кодеков также должны определить, как кодек будет обрабатывать ошибки кодирования и декодирования.
1.1. Обработчики ошибок
Для упрощения и стандартизации обработки ошибок кодеки могут реализовывать различные схемы обработки ошибок, принимая строковый аргумент errors. Следующие строковые значения определены и реализованы всеми стандартными кодеками Python:
| Значение | Значение |
|---|---|
'strict' | Поднять UnicodeError (или подкласс); это значение по умолчанию. Реализовано в strict_errors(). |
'ignore' | Пропустить поврежденные данные и продолжить без дальнейших уведомлений. Реализовано в ignore_errors(). |
Следующие обработчики ошибок применимы только к кодировкам текста:
| Значение | Значение |
|---|---|
'replace' | Заменить подходящим маркером замены; Python будет использовать официальный U+FFFD ЗАМЕЩАЮЩИЙ СИМВОЛ для встроенных кодеков при декодировании и ‘?’ при кодировании. Реализовано в replace_errors(). |
'xmlcharrefreplace' | Заменить соответствующей ссылкой на символ XML (только для кодирования). Реализовано в xmlcharrefreplace_errors(). |
'backslashreplace' | Заменить на обратные слеши escape-последовательности. Реализовано в backslashreplace_errors(). |
'namereplace' | Заменить на \N{...} escape-последовательности (только для кодирования). Реализовано в namereplace_errors(). |
'surrogateescape' | При декодировании заменить байт на отдельный суррогат код, диапазон от U+DC80 до U+DCFF. Этот код будет затем преобразован в тот же байт, когда обработчик 'surrogateescape' используется при кодировании данных. (См. PEP 383 для получения более подробной информации.) |
Кроме того, следующий обработчик ошибок специфичен для данных кодеков:
| Значение | Кодеки | Значение |
|---|---|---|
'surrogatepass' | utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le | Разрешить кодирование и декодирование суррогатных кодов. Эти кодеки обычно обрабатывают присутствие суррогатов как ошибку. |
Новое в версии 3.1: Обработчики ошибок 'surrogateescape' и 'surrogatepass'.
Изменено в версии 3.4: Обработчики ошибок 'surrogatepass' теперь работают с кодеками utf-16* и utf-32*.
Новое в версии 3.5: Обработчик ошибок 'namereplace'.
Изменено в версии 3.5: Обработчики ошибок 'backslashreplace' теперь работают с декодированием и переводом.
Множество разрешенных значений может быть расширено путем регистрации нового обработчика ошибок по имени:
-
codecs.register_error(name, error_handler) -
Регистрирует функцию обработки ошибок error_handler под именем name. Аргумент error_handler будет вызываться при кодировании и декодировании в случае ошибки, когда name указан как параметр errors.
Для кодирования error_handler будет вызван с экземпляром
UnicodeEncodeError, который содержит информацию о местоположении ошибки. Обработчик ошибок должен либо поднять это, либо другое исключение, либо вернуть кортеж с заменой для некодируемой части входных данных и позиции, где кодирование должно быть продолжено. Замена может быть либоstr, либоbytes. Если замена является байтами, кодировщик просто скопирует их в буфер вывода. Если замена является строкой, кодировщик закодирует замену. Кодирование продолжается на исходных входных данных в указанной позиции. Отрицательные значения позиции будут обрабатываться как относительные к концу входной строки. Если результирующая позиция находится за пределами границ, будет поднятоIndexError.Декодирование и перевод работают аналогично, за исключением того, что будет передан
UnicodeDecodeErrorилиUnicodeTranslateError, и замена из обработчика ошибок будет помещена непосредственно в вывод.
Ранее зарегистрированные обработчики ошибок (включая стандартные обработчики ошибок) могут быть просмотрены по имени:
-
codecs.lookup_error(name) -
Возвращает обработчик ошибок, ранее зарегистрированный под именем name.
Вызывает исключение
LookupErrorв случае, если обработчик не найден.
Следующие стандартные обработчики ошибок также доступны в качестве функций уровня модуля:
-
codecs.strict_errors(exception) -
Реализует обработку ошибок
'strict': каждая ошибка кодирования или декодирования вызывает исключениеUnicodeError.
-
codecs.replace_errors(exception) -
Реализует обработку ошибок
'replace'(только для кодировок текста): заменяет'?'на ошибки кодирования (для кодирования кодеком) и'\ufffd'(замещающий символ Unicode) на ошибки декодирования.
-
codecs.ignore_errors(exception) -
Реализует обработку ошибок
'ignore': некорректные данные игнорируются, и кодирование или декодирование продолжаются без дальнейших уведомлений.
-
codecs.xmlcharrefreplace_errors(exception) -
Реализует обработку ошибок
'xmlcharrefreplace'(только для кодирования с кодировками текста): некодируемый символ заменяется соответствующей XML-ссылкой на символ.
-
codecs.backslashreplace_errors(exception) -
Реализует обработку ошибок
'backslashreplace'(только для кодировок текста): некорректные данные заменяются экранированной последовательностью с обратным слэшем.
-
codecs.namereplace_errors(exception) -
Реализует обработку ошибок
'namereplace'(только для кодирования с кодировками текста): некодируемый символ заменяется на\N{...}экранированную последовательность.Введено в версии 3.5.
1.2. Бессостояние кодирование и декодирование
Базовый класс Codec определяет эти методы, которые также определяют функциональные интерфейсы бессостоятельного кодера и декодера:
-
Codec.encode(input[, errors]) -
Кодирует объект input и возвращает кортеж (объект output, количество потреблённых символов). Например, кодирование текста преобразует строковый объект в байтовый объект, используя кодировку набора символов (например,
cp1252илиiso-8859-1).Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен хранить состояние в экземпляре
Codec. ИспользуйтеStreamWriterдля кодеков, которым необходимо хранить состояние для повышения эффективности кодирования.Кодер должен уметь обрабатывать входные данные нулевой длины и возвращать пустой объект типа выходного объекта в этом случае.
-
Codec.decode(input[, errors]) -
Декодирует объект input и возвращает кортеж (объект output, количество потреблённых символов). Например, при кодировании текста, декодирование преобразует байтовый объект, закодированный с помощью кодировки определённого набора символов, в строковый объект.
Для текстовых кодировок и кодеков байт-в-байт, input должен быть байтовым объектом или объектом, предоставляющим интерфейс чтения только для буфера — например, объекты буфера и файлы с отображением памяти.
Аргумент errors определяет обработку ошибок. По умолчанию используется обработка
'strict'.Метод не должен хранить состояние в экземпляре
Codec. ИспользуйтеStreamReaderдля кодеков, которым необходимо хранить состояние для повышения эффективности декодирования.Декодер должен уметь обрабатывать входные данные нулевой длины и возвращать пустой объект типа выходного объекта в этом случае.
1.3. Инкрементное кодирование и декодирование
Классы IncrementalEncoder и IncrementalDecoder предоставляют базовый интерфейс для инкрементного кодирования и декодирования. Кодирование/декодирование входных данных не выполняется одним вызовом функции бессостоятельного кодера/декодера, а множеством вызовов метода encode()/decode() инкрементного кодера/декодера. Инкрементный кодер/декодер отслеживает процесс кодирования/декодирования во время вызовов методов.
Объединённый результат вызовов метода encode()/decode() такой же, как если бы все отдельные входные данные были объединены в один, а этот вход был закодирован/декодирован бессостоятельным кодером/декодером.
1.3.1. Объекты IncrementalEncoder
Класс IncrementalEncoder используется для кодирования входных данных по частям. Он определяет следующие методы, которые каждый инкрементный кодер должен определить для совместимости с реестром кодеков Python.
-
class codecs.IncrementalEncoder(errors='strict') -
Конструктор экземпляра
IncrementalEncoder.Все инкрементные кодеры должны предоставить этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
IncrementalEncoderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для возможных значений.Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этому атрибуту позволяет переключаться между различными стратегиями обработки ошибок во время существования объекта
IncrementalEncoder.-
encode(object[, final]) -
Кодирует object (принимая во внимание текущее состояние кодера) и возвращает закодированный объект. Если это последний вызов
encode(), final должно быть истинным (по умолчанию ложь).
-
reset() -
Сбрасывает кодер в начальное состояние. Выходные данные отбрасываются: вызовите
.encode(object, final=True), передав пустую строку байтов или текстовую строку, если необходимо, для сброса кодера и получения выходных данных.
-
-
IncrementalEncoder.getstate() -
Возвращает текущее состояние кодера, которое должно быть целым числом. Реализация должна гарантировать, что
0является наиболее распространённым состоянием. (Состояния, которые сложнее целых чисел, могут быть преобразованы в целые числа путём сериализации/сохранения состояния и кодирования байтов результирующей строки в целое число).
-
IncrementalEncoder.setstate(state) -
Устанавливает состояние кодера в state. state должно быть состоянием кодера, возвращённым методом
getstate().
1.3.2. Объекты IncrementalDecoder
Класс IncrementalDecoder используется для декодирования входных данных по частям. Он определяет следующие методы, которые каждый инкрементный декодер должен определить для совместимости с реестром кодеков Python.
-
class codecs.IncrementalDecoder(errors='strict') -
Конструктор экземпляра
IncrementalDecoder.Все инкрементные декодеры должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
Класс
IncrementalDecoderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. Возможные значения см. в Обработчики ошибок.Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этого атрибута позволяет переключаться между различными стратегиями обработки ошибок в течение срока службы объекта
IncrementalDecoder.-
decode(object[, final]) -
Декодирует object (учитывая текущее состояние декодера) и возвращает результирующий декодированный объект. Если это последний вызов к
decode(), final должно быть истинным (по умолчанию ложно). Если final истинно, декодер должен полностью декодировать входные данные и очистить все буферы. Если это невозможно (например, из-за неполных последовательностей байтов в конце входных данных), он должен инициировать обработку ошибок так же, как и в бессостоятельном случае (что может вызвать исключение).
-
reset() -
Сбросить декодер до начального состояния.
-
getstate() -
Возвращает текущее состояние декодера. Это должна быть кортеж с двумя элементами: первый — буфер с ещё не декодированными входными данными, второй — целое число, которое может содержать дополнительную информацию о состоянии. (Реализация должна гарантировать, что
0— это наиболее распространённая дополнительная информация о состоянии.) Если эта дополнительная информация о состоянии является0, должно быть возможно установить декодер в состояние, в котором нет буферизованных входных данных и0в качестве дополнительной информации о состоянии, чтобы подача ранее буферизованных входных данных в декодер вернула его в предыдущее состояние без создания какого-либо вывода. (Дополнительная информация о состоянии, которая сложнее целых чисел, может быть преобразована в целое число путём сериализации/пиклирования информации и кодирования байтов результирующей строки в целое число.)
-
setstate(state) -
Установить состояние кодера на state. state должен быть состоянием декодера, возвращённым методом
getstate().
-
1.4. Потоковая кодировка и декодировка
Классы StreamWriter и StreamReader предоставляют общие рабочие интерфейсы, которые можно использовать для реализации новых модулей кодирования очень легко. См. encodings.utf_8 для примера того, как это делается.
1.4.1. Объекты StreamWriter
Класс StreamWriter является подклассом Codec и определяет следующие методы, которые каждый потоковый писатель должен определить, чтобы быть совместимым с реестром кодеков Python.
-
class codecs.StreamWriter(stream, errors='strict') -
Конструктор экземпляра
StreamWriter.Все потоковые писатели должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть объектом типа «подобный файлу», открытым для записи текстовых или двоичных данных, соответствующим выбранному кодеку.
Класс
StreamWriterможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодировка подлежащего потока.Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этого атрибута позволяет переключаться между различными стратегиями обработки ошибок в течение срока службы объекта
StreamWriter.-
write(object) -
Записывает содержимое объекта, закодированное в поток.
-
writelines(list) -
Записывает конкатенированный список строк в поток (возможно, повторно используя метод
write()). Стандартные кодеки байты-в-байты не поддерживают этот метод.
-
reset() -
Очищает и сбрасывает буферы кодека, используемые для хранения состояния.
Вызов этого метода должен гарантировать, что данные на выходе находятся в чистом состоянии, которое позволяет добавлять новые свежие данные без необходимости повторного сканирования всего потока для восстановления состояния.
-
Помимо перечисленных методов, класс StreamWriter также должен унаследовать все остальные методы и атрибуты от подлежащего потока.
1.4.2. Объекты StreamReader
Класс StreamReader является подклассом Codec и определяет следующие методы, которые каждый потоковый читатель должен определить, чтобы быть совместимым с реестром кодеков Python.
-
class codecs.StreamReader(stream, errors='strict') -
Конструктор экземпляра
StreamReader.Все потоковые читатели должны предоставлять этот интерфейс конструктора. Они могут добавлять дополнительные ключевые аргументы, но только те, что определены здесь, используются реестром кодеков Python.
Аргумент stream должен быть объектом типа «подобный файлу», открытым для чтения текстовых или двоичных данных, соответствующим выбранному кодеку.
Класс
StreamReaderможет реализовывать различные схемы обработки ошибок, предоставляя ключевой аргумент errors. См. Обработчики ошибок для стандартных обработчиков ошибок, которые может поддерживать кодировка подлежащего потока.Аргумент errors будет присвоен атрибуту с тем же именем. Присвоение этого атрибута позволяет переключаться между различными стратегиями обработки ошибок в течение срока службы объекта
StreamReaderобъекта.Набор разрешённых значений для аргумента errors может быть расширен с помощью
register_error().-
read([size[, chars[, firstline]]]) -
Декодирует данные из потока и возвращает результирующий объект.
Аргумент chars указывает количество декодированных кодовых точек или байтов для возврата. Метод
read()никогда не вернёт больше данных, чем запрошено, но может вернуть меньше, если доступно недостаточно.Аргумент size указывает приблизительное максимальное количество закодированных байтов или кодовых точек для чтения при декодировании. Декодер может изменить это значение по мере необходимости. Значение по умолчанию -1 означает, что нужно прочитать и декодировать как можно больше. Этот параметр предназначен для предотвращения необходимости декодирования огромных файлов за один шаг.
Флаг firstline указывает, что достаточно вернуть только первую строку, если есть ошибки декодирования в последующих строках.
Метод должен использовать жадный подход к чтению, то есть читать как можно больше данных, разрешённых кодировкой и заданным размером, например, если необязательные окончания кодировки или маркеры состояния доступны в потоке, они тоже должны быть прочитаны.
-
readline([size[, keepends]]) -
Читает одну строку из входного потока и возвращает декодированные данные.
size, если задан, передаётся как аргумент size методу потока
read().Если keepends ложно, окончания строк удаляются из возвращаемых строк.
-
readlines([sizehint[, keepends]]) -
Читает все доступные строки из входного потока и возвращает их в виде списка строк.
Окончания строк реализуются с помощью метода декодера кодировки и включаются в записи списка, если keepends истинно.
sizehint, если задан, передаётся как аргумент size методу потока
read().
-
reset() -
Сбрасывает буферы кодека, используемые для хранения состояния.
Обратите внимание, что никаких перемещений потока не должно происходить. Этот метод предназначен в первую очередь для восстановления после ошибок декодирования.
-
Помимо перечисленных методов, класс StreamReader также должен унаследовать все остальные методы и атрибуты от подлежащего потока.
1.4.3. Объекты StreamReaderWriter
Класс StreamReaderWriter — это удобный класс, который позволяет обернуть потоки, работающие в режимах чтения и записи.
Конструктор создаётся таким образом, что можно использовать фабричные функции, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamReaderWriter(stream, Reader, Writer, errors) -
Создаёт экземпляр
StreamReaderWriter. Аргумент stream должен быть объектом, подобным файлу. Reader и Writer должны быть фабричными функциями или классами, предоставляющими интерфейсыStreamReaderиStreamWriterсоответственно. Обработка ошибок выполняется так же, как определено для потоковых читателей и писателей.
StreamReaderWriter экземпляры определяют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все другие методы и атрибуты от основного потока.
1.4.4. Объекты StreamRecoder
Объекты StreamRecoder переводят данные из одного кодирования в другое, что иногда бывает полезно при работе с различными кодировочными средами.
Конструктор создаётся таким образом, что можно использовать фабричные функции, возвращаемые функцией lookup(), для создания экземпляра.
-
class codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors) -
Создаёт экземпляр
StreamRecoder, который реализует двустороннее преобразование: encode и decode работают на переднем плане — данные, видимые коду, вызывающемуread()иwrite(), в то время как Reader и Writer работают на заднем плане — данные в stream.Эти объекты можно использовать для прозрачной транскодировки, например, из Latin-1 в UTF-8 и обратно.
Аргумент stream должен быть объектом, подобным файлу.
Аргументы encode и decode должны соответствовать интерфейсу
Codec. Reader и Writer должны быть фабричными функциями или классами, предоставляющими объекты интерфейсаStreamReaderиStreamWriterсоответственно.Обработка ошибок выполняется так же, как определено для потоковых читателей и писателей.
StreamRecoder экземпляры определяют объединённые интерфейсы классов StreamReader и StreamWriter. Они наследуют все другие методы и атрибуты от основного потока.
2. Обзор кодировок и Unicode
Строки хранятся внутри как последовательности кодовых точек в диапазоне 0x0–0x10FFFF. (См. PEP 393 для получения более подробной информации об реализации.) После использования объекта строки за пределами процессора и памяти порядок байтов и способ хранения этих массивов в виде байтов становятся проблемой. Как и в других кодеках, сериализация строки в последовательность байтов известна как кодирование, а восстановление строки из последовательности байтов — как декодирование. Существует множество различных кодеков для сериализации текста, которые коллективно называются кодировками текста.
Самая простая кодировка текста (называемая 'latin-1' или 'iso-8859-1') отображает кодовые точки 0–255 в байты 0x0–0xff, что означает, что объект строки, содержащий кодовые точки выше U+00FF, нельзя закодировать с помощью этого кодека. В этом случае будет поднято исключение UnicodeEncodeError, которое будет выглядеть следующим образом (хотя детали сообщения об ошибке могут отличаться): UnicodeEncodeError: 'latin-1' codec can't encode character '\u1234' in
position 3: ordinal not in range(256).
Существует ещё одна группа кодировок (так называемые кодировки charmap), которые выбирают другое подмножество всех кодовых точек Unicode и способ отображения этих кодовых точек в байты 0x0–0xff. Чтобы увидеть, как это делается, достаточно открыть, например, encodings/cp1252.py (кодировка, которая используется в основном в Windows). Существует строковая константа с 256 символами, показывающая, какой символ сопоставлен с каким значением байта.
Все эти кодировки могут кодировать только 256 из 1114112 кодовых точек, определённых в Unicode. Простым и прямым способом хранения каждой кодовой точки Unicode является хранение каждой кодовой точки в виде четырёх последовательных байтов. Есть две возможности: хранить байты в порядке big-endian или little-endian. Эти две кодировки называются UTF-32-BE и UTF-32-LE соответственно. Их недостатком является то, что, например, если вы используете UTF-32-BE на машине с little-endian, вам всегда придётся менять байты при кодировании и декодировании. UTF-32 решает эту проблему: байты всегда будут в естественном порядке следования байтов. Однако, если эти байты будут прочитаны процессором с другим порядком следования байтов, то байты всё равно придётся менять. Для того чтобы можно было определить порядок следования байтов в последовательности байтов UTF-16 или UTF-32, существует так называемый BOM («Byte Order Mark»). Это символ Unicode U+FEFF. Этот символ может быть добавлен в начало каждой последовательности байтов UTF-16 или UTF-32. Переставленные байты этого символа (0xFFFE) — это недопустимый символ, который не может появляться в тексте Unicode. Поэтому, если первый символ в последовательности байтов UTF-16 или UTF-32 оказывается U+FFFE, то байты необходимо поменять при декодировании. К сожалению, символ U+FEFF имел второе назначение как ZERO WIDTH NO-BREAK SPACE: символ, у которого нет ширины и который не позволяет разбивать слова. Его, например, можно использовать для указания подсказок алгоритму лигатур. В Unicode 4.0 использование U+FEFF в качестве ZERO WIDTH NO-BREAK SPACE было устаревшим (с U+2060 (WORD JOINER) в роли замены). Тем не менее, программное обеспечение Unicode по-прежнему должно уметь обрабатывать U+FEFF в обеих ролях: как BOM — для определения расположения байтов в памяти, который исчезает после декодирования последовательности байтов в строку; и как ZERO WIDTH
NO-BREAK SPACE — обычный символ, который декодируется как любой другой.
Существует ещё одна кодировка, способная кодировать весь диапазон символов Unicode: UTF-8. UTF-8 — это кодировка с 8 битами, что означает отсутствие проблем с порядком байтов в UTF-8. Каждый байт в последовательности байтов UTF-8 состоит из двух частей: маркеров (старшие биты) и полезных битов. Маркеры — это последовательность от нуля до четырёх 1 битов, за которыми следует 0 бит. Символы Unicode кодируются так (x — это полезные биты, которые, когда конкатенируются, дают символ Unicode):
| Диапазон | Кодирование |
|---|---|
U-00000000 … U-0000007F
| 0xxxxxxx |
U-00000080 … U-000007FF
| 110xxxxx 10xxxxxx |
U-00000800 … U-0000FFFF
| 1110xxxx 10xxxxxx 10xxxxxx |
U-00010000 … U-0010FFFF
| 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Наименее значимый бит символа Unicode — это самый правый x бит.
Поскольку UTF-8 — это кодировка с 8 битами, BOM не требуется, и любой символ U+FEFF в декодированной строке (даже если это первый символ) обрабатывается как ZERO
WIDTH NO-BREAK SPACE.
Без внешней информации невозможно надёжно определить, какая кодировка была использована для кодирования строки. Каждая кодировка charmap может декодировать любую случайную последовательность байтов. Однако это невозможно с UTF-8, так как последовательности байтов UTF-8 имеют структуру, которая не допускает произвольных последовательностей байтов. Чтобы повысить надёжность определения кодировки UTF-8, Microsoft разработала вариант UTF-8 (который Python 2.5 называет "utf-8-sig") для программы «Блокнот»: перед записью любого символа Unicode в файл записывается закодированный в UTF-8 BOM (который выглядит в виде последовательности байтов: 0xef, 0xbb, 0xbf). Поскольку маловероятно, что любой файл, закодированный в charmap, начнётся с этих значений байтов (которые, например, в iso-8859-1 будут отображаться как…), это повышает вероятность того, что кодировку utf-8-sig можно правильно угадать по последовательности байтов. Таким образом, здесь BOM используется не для определения порядка следования байтов для создания последовательности байтов, а как подпись, которая помогает угадать кодировку. При кодировании кодек utf-8-sig запишет 0xef, 0xbb, 0xbf в качестве первых трёх байтов в файл. При декодировании utf-8-sig пропустит эти три байта, если они появятся в начале файла. В UTF-8 использование BOM не рекомендуется и следует его избегать.
3. Стандартные кодировки
Python поставляется с рядом встроенных кодеков, реализованных либо в виде функций C, либо с помощью словарей в виде таблиц соответствия. В следующей таблице перечислены кодеки по их именам, вместе с некоторыми общими псевдонимами и языками, для которых кодировка, скорее всего, используется. Ни список псевдонимов, ни список языков не претендуют на полноту. Обратите внимание, что альтернативы написания, которые отличаются только регистром или использованием дефиса вместо нижнего подчёркивания, также являются допустимыми псевдонимами; поэтому, например, 'utf-8' является допустимым псевдонимом для кодека 'utf_8'.
Подробности реализации CPython: Некоторые распространённые кодировки могут обходить механизм поиска кодеков для повышения производительности. Эти возможности оптимизации распознаются CPython только для ограниченного набора псевдонимов: utf-8, utf8, latin-1, latin1, iso-8859-1, mbcs (только Windows), ascii, utf-16 и utf-32. Использование альтернативных написаний этих кодировок может привести к замедлению выполнения.
Многие наборы символов поддерживают одни и те же языки. Они различаются отдельными символами (например, поддерживается ли символ «ЕВРО» или нет), а также назначением символов в кодовых позициях. В частности, для европейских языков обычно существуют следующие варианты:
- набор символов 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 | Вьетнамский |
| cp65001 |
Только Windows: Windows UTF-8 ( Новая версия с 3.3. | |
| 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_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 | все языки |
| utf_8_sig | все языки |
Изменено в версии 3.4: Кодировщики utf-16* и utf-32* больше не допускают кодирование суррогатных кодовых точек (U+D800–U+DFFF). Декодеры utf-32* больше не декодируют последовательности байтов, соответствующие суррогатным кодовым точкам.
4. Специфичные для Python кодировки
Ряд предопределенных кодеков специфичны для Python, поэтому их имена кодеков не имеют смысла вне Python. Эти кодеки перечислены в таблицах ниже в зависимости от ожидаемых типов входных и выходных данных (обратите внимание, что, хотя кодировки текста являются наиболее распространенным случаем использования кодеков, базовая инфраструктура кодеков поддерживает произвольные преобразования данных, а не только кодировки текста).
4.1. Кодировки текста
Следующие кодеки обеспечивают кодирование str в bytes и декодирование объектов-последовательностей байтов в str, аналогично кодировкам текста Unicode.
| Кодек | Псевдонимы | Назначение |
|---|---|---|
| idna | Реализует RFC 3490, см. также encodings.idna. Поддерживается только errors='strict'. | |
| mbcs | dbcs | Только Windows: Кодирует операнд в соответствии с кодовой страницей ANSI (CP_ACP) |
| palmos | Кодировка PalmOS 3.5 | |
| punycode | Реализует RFC 3492. Состоятельные кодеки не поддерживаются. | |
| raw_unicode_escape | Кодировка Latin-1 с \uXXXX и \UXXXXXXXX для других кодовых точек. Существующие обратные слэши никак не экранируются. Используется в протоколе Python pickle. | |
| undefined | Вызывает исключение для всех преобразований, даже для пустых строк. Обработчик ошибок игнорируется. | |
| unicode_escape | Кодировка, подходящая в качестве содержимого литерала Unicode в коде Python, закодированном в ASCII, за исключением того, что кавычки не экранируются. Декодирует из кода Latin-1. Обратите внимание, что код Python по умолчанию использует UTF-8. | |
| unicode_internal |
Возвращает внутреннее представление операнда. Состоятельные кодеки не поддерживаются. Устарело начиная с версии 3.3: Это представление устарело из-за PEP 393. |
4.2. Бинарные преобразования
Следующие кодеки обеспечивают бинарные преобразования: соответствия между байтоподобным объектом и bytes. Они не поддерживаются bytes.decode() (который производит только str вывод).
| Кодек | Псевдонимы | Назначение | Кодировщик / декодер |
|---|---|---|---|
| base64_codec [1] | base64, base_64 |
Преобразовать операнд в многострочный MIME base64 (результат всегда включает завершающий Изменено в версии 3.4: принимает любой байтоподобный объект в качестве входных данных для кодирования и декодирования |
base64.encodebytes() / base64.decodebytes()
|
| bz2_codec | bz2 | Сжимает операнд с помощью bz2 |
bz2.compress() / bz2.decompress()
|
| hex_codec | hex | Преобразует операнд в шестнадцатеричное представление с двумя цифрами на байт |
binascii.b2a_hex() / binascii.a2b_hex()
|
| quopri_codec | quopri, quotedprintable, quoted_printable | Преобразует операнд в MIME quoted printable |
quopri.encode() с quotetabs=True / quopri.decode()
|
| uu_codec | uu | Преобразует операнд с помощью uuencode |
uu.encode() / uu.decode()
|
| zlib_codec | zip, zlib | Сжимает операнд с помощью gzip |
zlib.compress() / zlib.decompress()
|
| [1] | Помимо байтоподобных объектов, 'base64_codec' также принимает ASCII-только экземпляры str для декодирования |
Новое в версии 3.2: Восстановление бинарных преобразований.
Изменено в версии 3.4: Восстановление псевдонимов для бинарных преобразований.
4.3. Текстовые преобразования
Следующий кодек обеспечивает текстовое преобразование: соответствие между str и str. Он не поддерживается str.encode() (который производит только bytes вывод).
| Кодек | Псевдонимы | Назначение |
|---|---|---|
| rot_13 | rot13 | Возвращает шифрование Цезаря операнда |
Новое в версии 3.2: Восстановление текстового преобразования rot_13.
Изменено в версии 3.4: Восстановление псевдонима rot13.
5. encodings.idna — Международные доменные имена в приложениях
Этот модуль реализует RFC 3490 (Международные доменные имена в приложениях) и RFC 3492 (Nameprep: профиль Stringprep для международных доменных имён (IDN)). Он базируется на кодировке punycode и stringprep.
Эти 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 (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.
6. encodings.mbcs — Кодировка Windows ANSI
Кодировать операнд в соответствии с кодовой страницей ANSI (CP_ACP).
Доступность: только Windows.
Изменено в версии 3.3: Поддержка любого обработчика ошибок.
Изменено в версии 3.2: До версии 3.2 аргумент errors игнорировался; 'replace' всегда использовался для кодирования, а 'ignore' для декодирования.
7. encodings.utf_8_sig — Кодировка UTF-8 с сигнатурой BOM
Этот модуль реализует вариант кодировки UTF-8: при кодировании BOM UTF-8 будет добавлен перед байтами, закодированными в UTF-8. Для состоятельного кодировщика это выполняется только один раз (при первом записи в поток байтов). При декодировании необязательный BOM UTF-8 в начале данных будет пропущен.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/codecs.html