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

107

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

b"abcdef"

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

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

Крисс
источник
10
@SLott: перейдите по предоставленной вами ссылке, и вы увидите, что префикс b не разрешен в строковом префиксе ... для 2.6 (выглядит как небольшая ошибка в справочных материалах). И поискать в Google такие вещи непросто. Я пробовал такие ключевые слова, как «префикс строки питона b», и ничего не добился.
Крисс
В используемой С.Лоттом ссылке отсутствует спецификатор версии; это о Python 3: docs.python.org/3/reference/… . Префикс теперь также поддерживается в Python 2.6 и выше для облегчения кросс-версии кода Python.
Мартин Питерс
1
этот вопрос не является ни «точной копией», ни ответом на вопрос «Могу ли я избавиться от этого символа 'b' в моем операторе печати?» stackoverflow.com/questions/42599851/… не могли бы вы снять отметку, пожалуйста, Мариджин? Человек, который спрашивал, а также человек, который на самом деле пытался ответить, могут оценить возможность получить ответ на поставленный вопрос.
me_ 06

Ответы:

62

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

WRAR
источник
@WRAR: Был в коде python 2.6, я видел это, кажется, он был введен в python2.6
крисс
Я специально проверил это в справочнике 2.6 перед публикацией: docs.python.org/reference/lexical_analysis.html#literals
wRAR
1
Хорошо, "Для будущей совместимости Python 2.6 добавляет байты в качестве синонима типа str, а также поддерживает нотацию b ''." Из раздела "Что нового".
wRAR
как ссылки выше был добавлен в настоящее время указует на 2,7 ссылки и б префикс, вот ссылка на старое эталонном поддельном docs.python.org/release/2.6.8/reference/...
Kriss
98

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

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

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

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

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

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

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

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, так и на Python 3.

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

Мартейн Питерс
источник