Ответ 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()
если вам нужно иметь изменяемое значение байтов.