Что означает префикс b перед строкой python? - PullRequest
91 голосов
/ 07 апреля 2010

В исходном коде Python, на который я наткнулся, я увидел маленькую b перед строкой вроде:

b"abcdef"

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

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

Ответы [ 2 ]

80 голосов
/ 07 июня 2014

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

Если вы видите, что он используется в исходном коде Python 3, выражение создает объект bytes, не обычный Юникод 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() объект , если вам нужно значение изменяемого байта.

59 голосов
/ 07 апреля 2010

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

...