Что делает символ «b» перед строковым литералом? Ru Python


  • Ru Python
  • binary&nbsppython&nbspstring&nbspunicode
  • Что делает символ «b» перед строковым литералом?

По-видимому, следующий синтаксис …

my_string = b'The string' 

Я бы хотел знать…

  1. Что означает этот символ b символа строки?
  2. Каковы последствия его использования?
  3. Каковы подходящие ситуации для его использования.

Я нашел связанный вопрос прямо здесь, на SO, но этот вопрос касается PHP, хотя и указывает, что b используется для указания, что строка является двоичной, а не unicode, которая необходима для того, чтобы код был совместим с версией PHP <6 при переносе на PHP 6. Я не думаю, что это относится к Python.

Я нашел эту документацию на сайте python об использовании символа u в том же синтаксисе, чтобы указать строку как unicode. К сожалению, он не упоминает символ b нигде в этом документе.

Кроме того, только из любопытства, есть ли больше символов, чем b и u которые делают другие вещи?

  • Чтение двоичного файла с определенной последовательностью в Python
  • Размер буфера VS Размер файла при чтении двоичного файла в Python
  • Список битов Python в список байтов
  • Файл Python IO ‘w’ vs ‘wb’
  • Проблема чтения двоичных файлов Python

Чтобы процитировать документацию Python 2.x :

Префикс «b» или «B» игнорируется в Python 2; он указывает, что литерал должен быть литералом байтов в Python 3 (например, когда код автоматически преобразуется с 2to3). Префикс ‘u’ или ‘b’ может сопровождаться префиксом ‘r’.

В документации Python 3.3 указано:

Литералы байтов всегда имеют префикс «b» или «B»; они генерируют экземпляр типа байтов вместо типа str. Они могут содержать только символы ASCII; байты с числовым значением 128 или выше должны быть выражены с помощью экранов.

Python 3.x делает четкое различие между типами:

  • str = '...' literals = последовательность символов Unicode (UTF-16 или UTF-32, в зависимости от того, как был скомпилирован Python)
  • bytes =
    b'...'
    literals = последовательность октетов (целые числа от 0 до 255)

Если вы знакомы с Java или C #, подумайте о str как String и bytes as byte[] . Если вы знакомы с SQL, NVARCHAR str как NVARCHAR а bytesBINARY или BLOB . Если вы знакомы с реестром Windows, подумайте о str как REG_SZ и bytes как REG_BINARY . Если вы знакомы с C (++), забудьте все, что вы узнали о char и строках, потому что ХАРАКТЕР НЕ БЫТЬ . Эта идея давно устарела.

Вы используете

str когда хотите представить текст.

print('שלום עולם') 

Вы используете bytes когда хотите представлять низкоуровневые двоичные данные, такие как structs.

NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0] 

Вы можете кодировать str в объект bytes .

>>> '\uFEFF'.encode('UTF-8') b'\xef\xbb\xbf' 

И вы можете декодировать bytes в str .

>>> b'\xE2\x82\xAC'.decode('UTF-8') '€' 

Но вы не можете свободно смешивать два типа.

>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat bytes to str 

Обозначение b'...' несколько сбивает с толку, поскольку оно позволяет указать байты 0x01-0x7F с символами ASCII вместо шестнадцатеричных чисел.

>>> b'A' == b'\x41' True 

Но я должен подчеркнуть, что персонаж не байт .

>>> 'A' == b'A' False 

В версиях версии Python версии 3.0 не было такого различия между текстовыми и двоичными данными. Вместо этого было:

  • unicode = u'...' literals = последовательность символов Unicode = 3.x str
  • str = '...' litals = последовательности смешанных байтов / символов
    • Обычно текст, закодированный в некоторой неопределенной кодировке.
    • Но также используется для представления двоичных данных, таких как struct.pack output.

Чтобы облегчить переход 2.x-to-3.x, синтаксис b'...' был передан в Python 2.6, чтобы позволить различать двоичные строки (которые должны быть bytes в 3.x) из текста строки (которые должны быть str в 3.x). Префикс

b ничего не делает в 2.x, но говорит сценарию 2to3 не преобразовывать его в строку Unicode в 3.x.

Так что да, b'. ..' литералы в Python имеют ту же цель, что и в PHP.

Кроме того, только из любопытства, есть ли больше символов, чем b и u, которые делают другие вещи?

Префикс r создает необработанную строку (например, r'\t' – обратная косая черта + t вместо вкладки), а тройные кавычки '''...''' или """...""" позволяют multi Строковые литералы.

B обозначает байтовую строку.

Байт – это фактические данные. Строки – это абстракция.

Если у вас был многосимвольный строковый объект, и вы взяли один символ, это будет строка, и размер может быть более 1 байта в зависимости от кодировки.

Если взять 1 байт с байтовой строкой, вы получите одно 8-битное значение от 0-255, и оно может не представлять полный символ, если эти символы из-за кодирования были> 1 байт.

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

Он превращает его в bytes литерал (или str в 2.x) и действителен для 2.6+.

Префикс r вызывает обратную косую черту как «неинтерпретированную» (не игнорируется, и разница имеет значение).

Вот пример, в котором отсутствие «b» генерирует исключение TypeError в Python 3.x

>>> f=open("new", "wb") >>> f.write("Hello Python!") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' does not support the buffer interface 

Добавление префикса ‘b’ устранит проблему.

  • Понимание оператора Python «is»
  • Как передать переменную по ссылке?
  • Python: логический список двоичной строки
  • Python – лучший способ найти 1d-центр массы в двоичном массиве numpy
  • django: возвращает данные изображения из вида
  • чтение определенных цифр из двоичных данных
  • Получение исходного двоичного представления файла в Python
  • Отрицательное целое число до 32-битного двоичного кода
  • Python – как открыть удаленный файл в двоичном режиме чтения?
  • как xOR двоичный с python
  • Декомпрессия и чтение файлов Dukascopy . bi5

Что такое b String в Python?

Данные байта составляют строку Python b, что подразумевает, что литерал, представляющий целые числа, находится в диапазоне от 0 до 255. Тип данных строки Python b и строки Python значительно различается. Литералы типа данных bytes в строке Python b представляют значения от 0 до 255, тогда как традиционная строка содержит последовательность символов Unicode, таких как UTF-16 или UTF-32. В Python строки используются для представления текстовых данных и заключаются в одинарные или двойные кавычки. Экземпляр строки выглядит так:

# my_str = “This is a sample string”

Строки представляют данные, которые люди могут читать, такие как буквы, специальные символы, слова или почти что-нибудь еще, тогда как байты используются для представления низкоуровневых двоичных структур данных. Типы данных str и bytes в Python 2.x являются объектами типа Byte, но в Python 3.x это изменилось. Байты и строка различаются в первую очередь потому, что байты машиночитаемы, тогда как строка читается человеком, а текст в конечном итоге переводится в байты для обработки.

При добавлении префикса b к обычной строке Python тип данных был изменен со строки на байты. Строки можно преобразовать в байты, что называется кодированием, а преобразование байтов в строку называется декодированием. Чтобы лучше понять эту концепцию, давайте обсудим несколько примеров.

Содержание

  1. Пример 1
  2. Пример 2
  3. Пример 3
  4. Заключение

Пример 1

Байты относятся к литералам, представляющим значения от 0 до 255, тогда как str относятся к литералам, содержащим серию символов Юникода (закодированных в UTF-16 или UTF-32, в зависимости от компиляции Python). Мы изменили тип данных стандартной строки со строки на байты, добавив к ней префикс b. Предположим, у вас есть две строки str_one = ’Alex’ и string_two = b’Alexa ’

Что вы думаете? Эти двое похожи или разные? Различие в типе данных. Давайте посмотрим на типы обеих строковых переменных.

str_one = ‘Alex’

print(type(str_one))

str_two = b‘Alexa’

print(type(str_two))

Когда вышеупомянутый код запускается, создается следующий вывод.

Пример 2

Процедура, называемая кодированием, используется для преобразования строк в байты. Для преобразования байтов в строки можно использовать процедуру, известную как декодирование. Рассмотрим следующий пример:

В этом примере будет использоваться метод decode (). Функция преобразует схему шифрования, используемую для шифрования строки аргумента, в схему кодирования, используемую для кодирования строки аргумента, в выбранную схему шифрования. Эффект прямо противоположен кодированию. Давайте посмотрим на иллюстрацию и разберемся, как работает эта функция.

my_str = b‘Decoration’

print(‘\n\n Input:’)

print(my_str)

print(type(my_str))

result = my_str.decode()

print(‘\n\n Output:’)

print(result)

print(type(result))

Результат вышеупомянутого кода будет выглядеть примерно так.

Для начала мы сохранили строку ввода со значением «Украшение» в переменной my_str. Затем был представлен тип данных строки, а также входная строка. Затем использовалась функция decode (), и результат был сохранен в переменной результата. Наконец, мы записали строку в переменной результата и тип данных переменной. В итоге видно финал.

Пример 3

В нашем третьем примере мы преобразовали строки в байты. Сначала мы напечатали слово в приведенном ниже коде. Эта строка имеет длину 2. Поскольку это строка была закодирована с использованием функции encode () в следующей строке, что дало результат b ’\ xc3 \ x961′. Приведенная ниже закодированная строка имеет длину 3 байта, как указано в третьей строке кода.

print(‘Öl’)

print(‘Öl’.encode(‘UTF-8’))

print(len(‘Öl’.encode(‘UTF-8’)))

Вот результат после того, как мы выполнили программу.

Заключение

Теперь вы знаете концепцию строки ab в Python и как преобразовывать байты в строки и наоборот в Python из этой статьи. Мы рассмотрели подробный пример преобразования байтов в строки и строки в байты. Все методы хорошо объяснены примерами.

Эффект символа «b» перед строковым литералом в Python

Улучшить статью

Сохранить статью

Нравится Статья

indorexian

автор

6 опубликованных статей

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Нравится Статья

    В Python символ ‘ b ’ перед строкой используется для указания строки как « байтовая строка ».

    Например:

    b_str = b’Эй, я байтовая строка’

    Теперь b_str хранит не объект String, а объект байтовой строки.

    Разница между строками и байтовыми строками:

    Строки — это обычные символы в удобочитаемом формате, тогда как байтовые строки — это строки в байтах. Как правило, строки сначала преобразуются в байты, как и любой другой объект, потому что компьютер может хранить данные только в байтах. При работе с байтовыми строками они не конвертируются в байты , так как они уже в байтах .

    Как строки преобразуются в байты?

    Строки преобразуются в байты с использованием кодировки. Существуют различные форматы кодирования, с помощью которых строки могут быть преобразованы в байты. Например. ASCII, UTF-8 и т. д.

    Чтобы преобразовать строку в байтовую строку в Python:

    Python3

    var = 'Привет Я строка' .encode( 'ASCII' )

    print (var)

    Вывод

     b'Эй, я строка' 

    Если мы даже напечатаем тип переменной, мы получим тип байт :

    Python3

    var = «Эй, я строка» .encode( 900 65 ‘ASCII’ )

    печать ( тип (var))

    Вывод

     <класс 'bytes'> 

    Как байтовый объект преобразуется в строку?

    Точно так же, как кодирование используется для преобразования строки в байт, мы используем декодирование для преобразования байта в строку: b 'Привет, я Строка байтов' . decode( 'ASCII' )

    print (var)

    Output

     Hey I am a Byte String 

    Если мы даже напечатаем тип переменная, мы получим строку типа :

    Python3

    var = b
    'Эй, я строка'
    .decode( 'ASCII' )

    печать ( тип (var))

    Вывод

      

    Последнее обновление: 15 июн, 2022

    Нравится статья

    Сохранить статью

    python — Что делает символ «b» перед строковым литералом?

    Python 3.x делает четкое различие между типами:

    • str = '...' литералы = последовательность символов Unicode (Latin-1, UCS-2 или UCS-4, в зависимости от самый широкий символ в строке)
    • байт = b'.
      ..'
      литералы = последовательность октетов (целые числа от 0 до 255)

    Если вы знакомы с:

    • Java или C#, подумайте о str как о String и bytes как о byte[] ;
    • SQL, подумайте о str как о NVARCHAR и bytes как о BINARY или BLOB ;
    • Реестр Windows, подумайте о str как о REG_SZ и байт как REG_BINARY .

    Если вы знакомы с C(++), то забудьте все, что вы узнали о char и строках, потому что символ не является байтом . Эта идея давно устарела.

    Вы используете str , когда хотите представить текст.

     print('שלום עולם')
     

    Вы используете байт , когда хотите представить низкоуровневые двоичные данные, такие как структуры.

     NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
     

    Вы можете закодировать str в объект размером байт .

     >>> '\uFEFF'.encode('UTF-8')
    б'\xef\xbb\xbf'
     

    И вы можете декодировать байт в str .

     >>> b'\xE2\x82\xAC'.decode('UTF-8')
    '€'
     

    Но вы не можете свободно смешивать эти два типа.

     >>> b'\xEF\xBB\xBF' + 'Текст со спецификацией UTF-8'
    Traceback (последний последний вызов):
      Файл "", строка 1, в 
    TypeError: невозможно объединить байты в строку
     

    Нотация b'...' несколько сбивает с толку, поскольку позволяет указывать байты 0x01-0x7F с помощью символов ASCII вместо шестнадцатеричных чисел.

     >>> b'A' == b'\x41'
    Истинный
     

    Но я должен подчеркнуть, символ не является байтом .

     >>> 'А' == б'А'
    ЛОЖЬ
     

    В версиях Python до 3.0 не было такого различия между текстовыми и двоичными данными. Вместо этого было:

    • юникод = u'...' литералы = последовательность символов Unicode = 3.x str
    • str = '.