zaLinux.ru

Как добавить префикс «b» к имени переменной в Python?


Строки с префиксом «b» в Python

Рассмотрим следующий пример:

byte_string = b'test string'
print(byte_string)

В результате работы эти две строки выведут:

b'test string'

Строки с префиксом «b» – это последовательность байтов (bytes), то есть особый тип данных (такие как стоки, числа, списки и так далее).

Предположим, мы хотим сделать что-то вроде такого:

variable_string = "test string"
byte_string = b'variable_string'
print(byte_string)

То есть мы пытаемся конвертировать строку в байты, но в качестве строки мы подставляем переменную, содержащую нужную нам строку. Мы ожидаем увидеть идентичный первому скрипту результат, а именно:

b'test string'

Но вместо него мы получаем:

b'variable_string'

То есть последовательностью байтов стало имя переменной, а не её содержимое.

Возникает вопрос:

Как добавить префикс «b» к переменной, чтобы конвертировать её в последовательность байтов?

На самом деле, этот вопрос возникает только от непонимания такого типа данных как «байты».

Префикс «b» не конвертирует строку в байты. Он только указывает на строку байтов

На самом деле, префикс «b» никак не меняет и не конвертирует строку. Префикс «b» можно указывать только для строки с последовательностью байтов.

То есть после префикса «b» Python ожидает увидеть примерно следующее:

b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

Вы можете очень легко в этом убедиться, если попробуйте с префиксом «b» указать что-то вроде такого:

print(b'\привет')

Вы сразу получите ошибку:

  File "/home/mial/test/p/t39.py", line 3
    print(b'\привет')
          ^^^^^^^^^^
SyntaxError: bytes can only contain ASCII literal characters

Но имеется поблажка (исключение). В Python байты, которые соответствуют символам ASCII, отображаются как эти символы, а не как соответствующие им байты. Это может немного путать, но всегда можно распознать тип bytes по букве b.

То есть, благодаря этому исключению для символов ASCII, вместо того, чтобы записать

print(b'\x74\x65\x73\x74\x20\x73\x74\x72\x69\x6E\x67')

Мы можем записать следующее:



print(b'test string')

Эти строки абсолютно идентичны (по полученному результату) и их вывод будет одинаковым:

b'test string'
b'test string'

Итак, префикс «b» НЕ конвертирует строки. Префикс «b» указывает на байты. Но для некоторых символов сделано исключение и вместо записи в формате байтов \xXX их можно записать так, как выглядела бы строка ASCII.

По этой причине невозможно использовать префикс «b» с именами переменных. После префикса «b» может идти только последовательность байтов (которую для ASCII символов можно записать как сами ASCII символы).

Как правильно конвертировать переменную в байты

Для конвертации переменной содержащей строку в байты можно использовать либо функцию bytes(), либо метод строк .encode().

Пример использования функции bytes():

variable_string = "test string"
byte_string = bytes(variable_string, encoding='utf-8')
print(byte_string)

Пример использования метода .encode():

variable_string = "test string"
byte_string = variable_string.encode('utf-8')
print(byte_string)

Те, кто так и не понял о чём здесь говорится, могут спросить, а откуда мне знать какая кодировка используется? Ведь в формате b'STRING' не нужно было указывать никакую кодировку, то есть при использовании префикса «b» можно обойтись без кодировки, а с функцией bytes() нужно знать кодировку.

Повторяем ещё раз, строка с префиксом «b» должна представлять собой последовательность байтов, для которой понятие кодировки не применимо (если, конечно, вы не собираетесь конвертировать байты в строку). Именно поэтому там кодировка и не упоминается.


Что касается кодировки строки, которую вы хотите преобразовать в байты, то если строка прописана к исходном коде скрипта, то её кодировка такая же, как и файла скрипта. Если же строка поступает от пользователя или из внешних источников (например, данные полученные при парсинге веб-сайта), то вам нужно самостоятельно определить кодировку. В настоящее время в большинстве случаев это будет utf-8. Но могут быть и неожиданные исключения, особенно в CMD в Windows.

Заключение

  1. Итак, строка с префиксом «b» не конвертируется в байты — там уже должна быть последовательность байтов.
  2. Символы ASCII можно указывать с префиксом «b» в качестве буквальных символов — это просто исключение, о котором нужно знать.
  3. Для конвертации строки в байты нужно использовать функцию bytes() либо метод .encode().

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *