Строки с префиксом «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.
Заключение
- Итак, строка с префиксом «b» не конвертируется в байты — там уже должна быть последовательность байтов.
- Символы ASCII можно указывать с префиксом «b» в качестве буквальных символов — это просто исключение, о котором нужно знать.
- Для конвертации строки в байты нужно использовать функцию bytes() либо метод .encode().
Связанные статьи:
- Как запустить программу из Python: как выполнить системную команду или другой скрипт Python (полное руководство) (51.3%)
- Как запустить небольшой код Python в Bash (50%)
- Как очистить список в Python. Почему при очистке списка удаляются его копии в других переменных (50%)
- Биты, байты и двоичные данные (38.3%)
- От 0 до F: шестнадцатеричные числа (38.3%)
- Решение проблемы с предупреждением InsecurePlatformWarning: A true SSLContext object is not available. (RANDOM - 1.3%)