Что означает префикс b перед строкой python?

В исходном коде на python я наткнулся на то, что перед строкой вроде <: p >

b"abcdef"

Я знаю о префиксе u, обозначающем строку юникода, и префикс r для строкового литерала строки.

Что означает b и в каком виде исходного кода он полезен, поскольку он выглядит как простая строка без какого-либо префикса?

Ответ 1

Это Python3 bytes literal. Этот префикс отсутствует в Python 2.5 и старше (он эквивалентен простой строке 2.x, а простая строка 3.x эквивалентна литералу с префиксом u в 2.x). В Python 2.6+ он эквивалентен простой строке для совместимости с 3.x.

Ответ 2

Префикс b обозначает строковый литерал bytes.

Если вы видите, что он используется в исходном коде Python 3, выражение создает объект bytes, а не обычный объект Unicode str. Если вы видите, что это повторяется в вашей оболочке Python или как часть списка, dict или другого содержимого контейнера, то вы видите объект bytes представленный с использованием этой нотации.

bytes основном содержат последовательность целых чисел в диапазоне 0-255, но при представлении Python отображает эти байты как кодовые точки ASCII, чтобы упростить чтение их содержимого. Любые байты вне диапазона печати символов ASCII отображаются как escape-последовательности (например, \n, \x82 и т.д.). И наоборот, вы можете использовать оба символа ASCII и escape-последовательности для определения значений байтов; для значений ASCII используется их числовое значение (например, b'A' == b'\x41')

Поскольку объект bytes состоит из последовательности целых чисел, вы можете построить объект bytes из любой другой последовательности целых чисел со значениями в диапазоне 0-255, например, в виде списка:

bytes([72, 101, 108, 108, 111])

и индексирование возвращает вам целые числа (но нарезка создает новое значение bytes, для приведенного выше примера value[1] дает вам 101, но value[:1] равно b'H' поскольку 72 является точкой кода ASCII для капитала буква H).

bytes двоичных данных, включая кодированный текст. Если значение вашего bytes содержит текст, вам необходимо его сначала декодировать, используя правильный кодек. Например, если данные кодируются как UTF-8, вы можете получить значение Unicode str с:

strvalue = bytesvalue.decode('utf-8')

И наоборот, чтобы перейти от текста в str объекте к bytes, необходимо закодировать. Вам нужно решить, какую кодировку использовать; по умолчанию используется UTF-8, но то, что вам нужно, сильно зависит от вашего прецедента:

bytesvalue = strvalue.encode('utf-8')

Вы также можете использовать конструктор, bytes(strvalue, encoding) чтобы сделать то же самое.

Оба метода декодирования и кодирования принимают дополнительный аргумент, чтобы указать, как следует обрабатывать ошибки.

Python 2, версии 2.6 и 2.7 также поддерживают создание строковых литералов с использованием синтаксиса строковых литералов b'..', чтобы облегчить выполнение кода, который работает как на Python 2, так и на 3.

bytes неизменны, как и строки str. Используйте объект bytearray() если вам нужно иметь изменяемое значение байтов.