Перейти к содержимому

Как перевести строку в байты python

  • автор:

Байтовые строки bytes в Python

Тип данных bytes — это неизменяемые последовательности отдельных байтов. Основные двоичные протоколы основаны на кодировании текста ASCII .

Синтаксис для байтовых литералов в основном такой же, как и для строковых литералов, за исключением того, что добавляется префикс ‘b’ :

  • Одинарные кавычки: b’still allows embedded «double» quotes’
  • Двойные кавычки: b»still allows embedded ‘single’ quotes»
  • Тройные кавычки: b»’3 single quotes»’b»»»3 double quotes»»»

Как и в случае строковых литералов, байтовые литералы могут также использовать префикс ‘r’ для отключения обработки escape-последовательностей.

Помимо литеральных форм, объекты bytes могут быть созданы с помощью встроенного класса bytes() :

  • Заполненный нулями объект байтов указанной длины: bytes(10) .
  • Из итерируемых целых чисел: bytes(range(20)) .
  • Копирование существующих двоичных данных через буферный протокол: bytes(obj) .

В то время как байтовые литералы основаны на тексте ASCII , байтовые объекты фактически ведут себя как неизменяемые последовательности целых чисел, причем каждое значение в последовательности ограничено таким образом, что 0

Для байтовых строк доступны следующие операции:

  • общие операции c последовательностями;
  • методы доступные bytes и bytearray типам.

Две шестнадцатеричные цифры точно соответствуют одному байту, поэтому шестнадцатеричные числа являются широко используемым форматом для описания двоичных данных. Соответственно, тип bytes имеет дополнительный метод класса для чтения данных в этом формате:

bytes.fromhex(string) ::

Метод bytes.fromhex() возвращает объект bytes , декодируя данный строковый объект. Строка должна содержать две шестнадцатеричные цифры на байт, при этом пробелы ASCII игнорируются.

>>> bytes.fromhex('2Ef0 F1f2 ') # b'.\xf0\xf1\xf2' 
bytes.hex() ::

Метод bytes.hex() преобразовывает объект bytes в его шестнадцатеричное представление. Возвращает строковый объект, содержащий две шестнадцатеричные цифры для каждого байта.

>>> b'\xf0\xf1\xf2'.hex() # 'f0f1f2' 

В Python-3.8 метод bytes.hex() поддерживает необязательные параметры sep и bytes_per_sep для вставки разделителей между байтами в шестнадцатеричный вывод.

Если нужно облегчить чтение шестнадцатеричной строки, можно указать параметр sep разделителя из одного символа для включения в вывод. По умолчанию между каждым байтом. Второй необязательный параметр bytes_per_sep управляет интервалом. Положительные значения вычисляют положение разделителя справа, отрицательные значения слева.

>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') # 'f0-f1-f2' >>> value.hex('_', 2) # 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) #'55554444 4c524c52 4142' 

Важно: Поскольку байтовые объекты являются неизменяемыми последовательностями целых чисел (подобно кортежу), то для байтового объекта ‘b’ , b[0] будет целым числом, а b[0:1] — байтовым объектом длины 1. Это контрастирует с текстовыми строками, где индексация и срез будут производить строку длиной 1 символ.

Представление объектов bytes использует литеральный формат (b’. ‘) так как это часто более полезно и наглядно, чем, например, bytes([46, 46, 46]) . Вы всегда можете преобразовать объект bytes в список целых чисел с помощью list(b).

Примеры использования:
>>> b = bytes([46, 46, 46]) >>> b # b'. ' >>> list(b) # [46, 46, 46] >>> b = bytes(range(40,60,2)) >>> b # b'(*,.02468:' >>> list(b) [40, 42, 44, 46, 48, 50, 52, 54, 56, 58] 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Утиная типизация ‘Duck Typing’
  • Что такое вызываемый объект callable?
  • Как проверить тип переменной/объекта
  • Логический тип данных bool
  • Целые числа int
  • Ограничение длины преобразования целочисленной строки
  • Вещественные числа float
  • Комплексные числа complex
  • Типы последовательностей
  • Список list
  • Кортеж tuple
  • Диапазон range
  • Текстовые строки str
  • Словарь dict
  • Множество set и frozenset
  • Итератор Iterator, протокол итератора
  • Генератор generator и выражение yield
  • Контекстный менеджер with
  • Байтовые строки bytes
  • Байтовый массив bytearray
  • Тип memoryview, буфер обмена
  • Файловый объект file object
  • Универсальный псевдоним GenericAlias
  • Объект объединения Union

Преобразование байтов в строку в Python

В этой статье мы рассмотрим, как преобразовать байты в строку в Python. К концу этой статьи у вас будет четкое представление о том, что это за типы и как эффективно обрабатывать данные с их помощью.

В зависимости от версии Python, которую вы используете, эта задача будет отличаться. Хотя Python 2 подошел к концу, многие проекты все еще используют его, поэтому мы включим оба подхода — Python 2 и Python 3.

Преобразование байтов в строку в Python 3

Начиная с Python 3, пришлось отказаться от старого способа работы с ASCII, и Python стал полностью Unicode.

Это означает, что мы потеряли явный тип Unicode: u»string» — каждая строка — это u»string» !

Чтобы отличить эти строки от старых добрых строк байтов, мы познакомились с новым спецификатором для них — b»string» .

Это было добавлено в Python 2.6, но не служило реальной цели, кроме подготовки к Python 3, поскольку все строки были байтовыми строками в 2.6.

Строки байтов в Python 3 официально называются bytes , неизменной последовательностью целых чисел в диапазоне 0

Преобразование байтов в строку с помощью decode()

Давайте посмотрим, как мы можем преобразовать байты в String, используя встроенный метод decode() для класса bytes :

b = b"Lets grab a \xf0\x9f\x8d\x95!" # Let's check the type print(type(b)) # # Now, let's decode/convert them into a string s = b.decode('UTF-8') print(s) # "Let's grab a ��!" 

Передав формат кодирования, мы преобразовали объект bytes в строку и распечатали ее.

Преобразование байтов в строку с кодеками

Как вариант, для этой цели мы можем использовать встроенный модуль codecs :

import codecs b = b'Lets grab a \xf0\x9f\x8d\x95!' print(codecs.decode(b, 'UTF-8')) # "Let's grab a ��!" 

Вам действительно не нужно передавать параметр кодировки, однако рекомендуется передавать его:

print(codecs.decode(b)) # "Let's grab a ��!" 
Преобразование байтов в строку с помощью str()

Наконец, вы можете использовать str() функцию, которая принимает различные значения и преобразует их в строки:

b = b'Lets grab a \xf0\x9f\x8d\x95!' print(str(b, 'UTF-8')) # "Let's grab a ��!" 

Не забудьте указать аргумент кодировки str() , иначе вы можете получить неожиданные результаты:

print(str(b)) # b'Lets grab a \xf0\x9f\x8d\x95!' 

Это снова подводит нас к кодировкам. Если вы укажете неправильную кодировку, в лучшем случае произойдет сбой вашей программы, потому что она не может декодировать данные. Например, если бы мы попытались использовать функцию str() с UTF-16 , нас бы встретили:

print(str(b, 'UTF-16')) # '敌❴\u2073牧扡愠\uf020趟↕' 

Это даже более важно, учитывая, что Python 3 любит использовать Unicode, поэтому, если вы работаете с файлами или источниками данных, которые используют непонятную кодировку, обязательно обратите на это особое внимание.

Преобразование байтов в строку в Python 2

В Python 2 набор байтов и строка — это практически одно и то же: строки — это объекты, состоящие из однобайтовых символов, что означает, что каждый символ может хранить 256 значений. Вот почему их иногда называют строками байтов.

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

s = "Hello world!" print(s) # 'Hello world!' print(len(s)) # 12

Однако использование символов Unicode в строках байтов немного меняет это поведение:

s = "Let's grab a ��!" print(s) # 'Lets grab a \xf0\x9f\x8d\x95!' # Where has the pizza gone to? print(len(s)) # 17 # Shouldn't that be 15? 
Преобразование байтов в Unicode (Python 2)

Здесь нам придется использовать тип Python 2 Unicode , который предполагается и автоматически используется в Python 3. В нем строки хранятся как последовательность кодовых точек, а не байтов.

Представляет собой байты \xf0\x9f\x8d\x95 , последовательность шестнадцатеричных чисел и Python не знает, как представить их в виде ASCII:

>>> u = u"Let's grab a ��!" u"Let's grab a \U0001f355!"" >>> u "Let's grab a ��!" # Yum. >>> len(u) 15 

Как вы можете видеть выше, строка Unicode содержит \U0001f355 — экранированный символ Unicode, который наш терминал распечатывает как кусок пиццы! Установить это было так же просто, как использовать спецификатор u перед значением байтовой строки.

Итак, как мне переключаться между ними?

Вы можете получить строку Unicode, расшифровав свою байтовую строку. Это можно сделать, создав объект Unicode, предоставив байтовую строку и строку, содержащую имя кодировки в качестве аргументов, или вызвав .decode(encoding) у байтовой строки.

Преобразование байтов в строку с помощью decode() (Python 2)

Вы также можете использовать codecs.encode(s, encoding) из модуля codecs .

>>> s = "Let's grab a \xf0\x9f\x8d\x95!" >>> u = unicode(s, 'UTF-8') >>> u "Let's grab a ��!" >>> s.decode('UTF-8') "Let's grab a ��!" 
Преобразование байтов в строку с помощью кодеков (Python 2)

Или, используя модуль codecs :

import codecs >>> codecs.decode(s, 'UTF-8') "Let's grab a ��!" 

Помните о своей кодировке

Здесь следует предостеречь — байты могут по-разному интерпретироваться в разных кодировках. Из- за того, что из коробки доступно около 80 различных кодировок, может быть нелегко узнать, есть ли у вас правильная!

s = '\xf8\xe7' # This one will let us know we used the wrong encoding >>> s.decode('UTF-8') UnicodeDecodeError: 'utf8' codec can't decode byte 0xf8 in position 0: invalid start byte # These two overlaps and this is a valid string in both >>> s.decode('latin1') øç s.decode('iso8859_5') јч 

Исходное сообщение было либо, øç либо јч , и оба кажутся допустимыми преобразованиями.

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

Вы хотите переменную в байты перевести? Или полученную строку присвоить к переменной?

25 сен 2021 в 8:54

Или всё-таки строку?

25 сен 2021 в 8:55

@Tehnorobot переменную в байты

25 сен 2021 в 9:05

@dontHacker1234 так нельзя делать, лучше используйте переменную в качестве носителя строки.

25 сен 2021 в 9:08

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Да много вариантов есть. В дополнение к предыдущим:

a=bytes('Строка байт', encoding = 'utf-8') b=a print (b) b'\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0 \xd0\xb1\xd0\xb0\xd0\xb9\xd1\x82' 
a='Это будет строка байт'.encode('utf-8') b = bytearray(a) print (b) bytearray(b'\xd0\xad\xd1\x82\xd0\xbe \xd0\xb1\xd1\x83\xd0\xb4\xd0\xb5\xd1\x82 \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0 \xd0\xb1\xd0\xb0\xd0\xb9\xd1\x82') 

Или даже так: именно «готовая» переменная — в байты:

t='Строка байт' a=bytes(t, encoding = 'utf-8') print (a) 

Метод str.encode() в Python, преобразует строку в байты

Метод str.encode() вернет закодированную версию строки str как объект байтов. Другими словами кодирует текстовую строку str в строку байтов, используя указанную кодировку encoding .

Аргумент encoding по умолчанию используется ‘utf-8’ . Для получения списка всех схем кодирования смотрите Стандартные кодировки.

Аргумент errors может быть задан для установки другой схемы обработки ошибок. Значение по умолчанию для ошибок является ‘strict’ , это означает, что при ошибке кодирования будет подниматься исключение UnicodeError .Другие стандартные значения обработчика ошибок, это ‘ignore’ , ‘replace’ , ‘xmlcharrefreplace’ , ‘backslashreplace’ или любое другое значение, зарегистрированное с помощью codecs.register_error() .

Стандартные схемы обработки ошибок:

  • strict — возбуждается UnicodeError , при попадании ошибочных символов*;
  • ignore — ошибочных символов* пропускаются;
  • replace — ошибочных символов* заменяются на ? ;
  • xmlcharrefreplace — ошибочных символов* заменяются на соответствующее им XML-представление;
  • backslashreplace — ошибочных символов* заменяются на последовательности, начинающиеся с обратной косой черты;
  • namereplace — ошибочных символов* заменяются на последовательности вида \N ;
  • surrogateescape — заменяет каждый байт на код суррогата, от U+DC80 до U+DCFF ;
  • surrogatepass — игнорирует коды суррогатов. Используется со следующими кодеками: utf-8, utf-16, utf-32, utf-16-be, utf-16-le, utf-32-be, utf-32-le;

*ошибочные символы — это символы, которые не поддерживаются указанной encoding кодировкой.

Изменено в Python-3.1: добавлена ​​поддержка ключевых слов.

Примеры преобразования текстовых строк в байтовые строки.

>>> x = 'кодирует в строку байтов' # У закодированной строки появился литерал 'b' - строка байтов >>> x.encode('utf-8') # b'\xd0\xba\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x80\xd1\x83\xd0\xb5\xd1\x82 / # \xd0\xb2 \xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd1\x83 / # \xd0\xb1\xd0\xb0\xd0\xb9\xd1\x82\xd0\xbe\xd0\xb2' # В кодировке ascii нет русских букв >>> x.encode('ascii') # Traceback (most recent call last): # File "", line 1, in # UnicodeEncodeError: 'ascii' codec can't encode characters in # position 0-7: ordinal not in range(128) # В кодировке ascii нет русских букв >>> x.encode('ascii', errors='ignore') # b' ' >>> x.encode('ascii', errors='replace') # b'. ? . . ' >>> 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Метод str.capitalize(), первая буква в строке заглавная
  • Метод str.casefold(), сворачивает регистр строки
  • Метод str.center(), выравнивает строку по центру
  • Метод str.count(), считает совпадения в строке
  • Метод str.encode(), преобразует строку в байты
  • Метод str.endswith(), совпадение с концом строки
  • Метод str.expandtabs(), меняет табуляцию на пробел
  • Метод str.find(), индекс первого совпадения в строке
  • Метод str.format(), форматирует строку
  • Метод str.format_map()
  • Метод str.index(), индекс первого совпадения подстроки
  • Метод str.isalnum(), строка состоит из цифр и букв
  • Метод str.isalpha(), строка состоит только из букв
  • Метод str.isascii(), все символы в строке являются ASCII
  • Метод str.isdecimal(), проверяет строку на десятичное число
  • Метод str.isdigit(), строка состоит только из цифр
  • Метод str.isidentifier() проверяет строку на идентификатор Python
  • Метод str.islower( ), проверяет строку на нижний регистр
  • Метод str.isnumeric(), проверяет строку на числовые символы
  • Метод str.isprintable(), проверяет на доступность для печати
  • Метод str.isspace(), является ли строка пробелом
  • Метод str.istitle(), проверяет наличие заглавных букв в словах
  • Метод str.isupper(), проверяет строку на верхний регистр
  • Метод str.join(), объединяет список строк
  • Метод str.ljust(), ровняет строку по левому краю
  • Метод str.lower(), строку в нижний регистр
  • Метод str.lstrip(), обрезает символы в начале строки
  • Метод str.maketrans(), таблица символов для str.translate()
  • Метод str.partition(), делит строку по первому совпадению
  • Метод str.removeprefix(), удаляет префикс строки
  • Метод str.removesuffix(), удаляет суффикс строки
  • Метод str.replace(), меняет подстроку/символ в строке
  • Метод str.rfind(), индекс последнего совпадения подстроки
  • Метод str.rindex(), индекс последнего совпадения в строке
  • Метод str.rjust(), ровняет строку по правому краю
  • Метод str.rpartition(), делит строку по последнему совпадению
  • Метод str.rsplit(), делит строку справа
  • Метод str.rstrip(), обрезает символы на конце строки
  • Метод str.split(), делит строку по подстроке
  • Метод str.splitlines(), делит текст по символу ‘\n’
  • Метод str.startswith(), совпадение с началом строки
  • Метод str.strip(), обрежет строку с обоих концов
  • Метод str.swapcase(), сменит регистр символов в строке
  • Метод str.title(), каждое слово с заглавной буквы
  • Метод str.translate(), транслирование строки
  • Метод str.upper(), переведет строку в верхний регистр
  • Метод str.zfill(), дополнит строку нулями
  • Форматирование строк в стиле printf
  • F-string. Форматированные строки

Добавить комментарий

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