Видимо, следующий допустимый синтаксис:
my_string = b'The string'
Я бы хотел знать:
- Что означает этот
b
символ перед строкой? - Каковы последствия его использования?
- Каковы подходящие ситуации, чтобы использовать это?
Я нашел связанный вопрос прямо здесь, на SO, но этот вопрос касается PHP, и в нем говорится, что b
он используется, чтобы указать, что строка является двоичной, в отличие от Unicode, который был необходим для совместимости кода из версии PHP <6 , при переходе на PHP 6. Я не думаю, что это относится к Python.
Я нашел эту документацию на сайте Python об использовании u
символа в том же синтаксисе для указания строки как Unicode. К сожалению, в этом документе нигде не упоминается символ b .
Кроме того, просто из любопытства, есть ли больше символов, чем b
и u
которые делают другие вещи?
unicode_literals
из__future__
, это «обратное» поведение для этой конкретной строки (в Python 2.x)Python 3.x проводит четкое различие между типами:
str
='...'
литералы = последовательность символов Unicode (UTF-16 или UTF-32, в зависимости от того, как Python был скомпилирован)bytes
=b'...'
литералы = последовательность октетов (целые числа от 0 до 255)Если вы знакомы с Java или C #, подумайте,
str
какString
иbytes
какbyte[]
. Если вы знакомы с SQL, подумайтеstr
какNVARCHAR
иbytes
какBINARY
илиBLOB
. Если вы знакомы с реестром Windows, подумайтеstr
какREG_SZ
иbytes
какREG_BINARY
. Если вы знакомы с C (++), то забудьте все, что вы узнали,char
и строки, потому что CHARACTER НЕ БАЙТ . Эта идея давно устарела.Вы используете,
str
когда вы хотите представить текст.Вы используете,
bytes
когда хотите представить низкоуровневые двоичные данные, такие как структуры.Вы можете кодировать
str
кbytes
объекту.И вы можете расшифровать
bytes
вstr
.Но вы не можете свободно смешивать два типа.
b'...'
Нотация несколько запутанным в том , что она позволяет байты 0x01-0x7F должны быть указаны с ASCII - символов вместо шестнадцатеричных цифр.Но я должен подчеркнуть, что символ не байт .
В Python 2.x
В версиях Python до 3.0 не было такого различия между текстовыми и двоичными данными. Вместо этого было:
unicode
=u'...'
литералы = последовательность символов Unicode = 3.xstr
str
='...'
литералы = последовательности смешанных байтов / символовstruct.pack
вывод.Чтобы облегчить переход с 2.x на 3.x,
b'...'
буквальный синтаксис был перенесен в Python 2.6, чтобы позволить отличать двоичные строки (которые должны бытьbytes
в 3.x) от текстовых строк (которые должны бытьstr
в 3 .Икс).b
Приставка ничего не делает в 2.x, но говорит2to3
сценарий не преобразовать его в строку Unicode в 3.x.Так что да,
b'...'
литералы в Python имеют ту же цель, что и в PHP.r
Префикс создает строку (например,r'\t'
является обратным слэшем +t
вместо вкладки), а также тройные кавычки'''...'''
или"""..."""
позволяют многострочным строковые литералы.источник
'A' == b'A' --> False
Проверка действительно делает это ясно. В остальном это отлично, но до этого момента я не понимал, что строка байтов на самом деле не'שלום עולם' == 'hello world'
B обозначает байтовую строку.
Байты являются фактическими данными. Строки - это абстракция.
Если у вас был многосимвольный строковый объект и вы взяли один символ, это будет строка, и ее размер может быть больше 1 байта в зависимости от кодировки.
Если взять 1 байт со строкой байтов, вы получите одно 8-битное значение от 0 до 255, и оно может не представлять полный символ, если эти символы из-за кодировки были> 1 байта.
TBH Я бы использовал строки, если у меня не было какой-то конкретной причины низкого уровня для использования байтов.
источник
Со стороны сервера, если мы отправим какой-либо ответ, он будет отправлен в виде байтового типа, поэтому он будет отображаться в клиенте как
b'Response from server'
Для того, чтобы избавиться от
b'....'
просто используйте ниже код:Файл сервера:
Клиентский файл:
тогда он напечатает
Response from server
источник
Вот пример, где отсутствие
b
бросило быTypeError
исключение в Python 3.xДобавление
b
префикса решит проблему.источник
Он превращает его в
bytes
литерал (илиstr
в 2.x) и действителен для 2.6+.r
Префикс вызывает обратные косые быть «необработанном» (не игнорируется, а разница делает дело).источник
str
версия 2.x в любом случае, поэтому можно сказать, что она игнорируется. Различие имеет значение при импортеunicode_literals
из__future__
модуля.В дополнение к тому, что сказали другие, обратите внимание, что один символ в юникоде может состоять из нескольких байтов .
Юникод работает так, что он взял старый формат ASCII (7-битный код, который выглядит как 0xxx xxxx) и добавил многобайтовые последовательности, где все байты начинаются с 1 (1xxx xxxx), чтобы представить символы за пределами ASCII, чтобы Юникод был обратным -совместимый с ASCII.
источник
Вы можете использовать JSON, чтобы преобразовать его в словарь
{ "Ключ": "значение"}
ФЛЯГА:
Это пример из колбы. Запустите это на терминальной линии:
В фляге / rout.py
{ 'Ключ': 'значение'}
источник