Строки с префиксом b: работа с байтами в Python
Раздел: Основы Python -> Работа со строками и байтами
Основы байтовых строк (b-строк)
Байтовые литералы в Python создаются с помощью префикса
b или B перед строкой в кавычках: b'текст' или b"текст". Результатом будет объект типа bytes, а не str. Основное отличие – bytes представляет последовательность чисел (0–255), тогда как str – последовательность символов Unicode. Байтовые строки используются для работы с бинарными данными (файлы, сетевые протоколы, шифрование) и при взаимодействии с системными вызовами. Пример:data = b'hello'
print(type(data)) # <class 'bytes'>
print(data) # b'hello'использование b в python (использование префикса b в python)
Каждый символ в литералеb'hello' должен принадлежать ASCII (0-127), иначе Python вызовет синтаксическую ошибку. Для не-ASCII символов нужно использовать соответствующие коды или эскейп-последовательности.Проблема: если в
b'' встретится символ вне ASCII (например, русская буква), возникнет SyntaxError: bytes can only contain ASCII literal characters. Решение: использовать эскейп-последовательности (\x, \u, \U) или преобразовывать строку в байты через метод .encode().Как преобразовать обычную строку в байты и обратно?
Основной способ – методы.encode() и .decode(). encode переводит str в bytes с заданной кодировкой (по умолчанию UTF-8). decode делает обратное. Пример:text = 'Привет'
bytes_text = text.encode('utf-8')
print(bytes_text) # b'\xd0\x9f\xd1\x80\xd0\xb8...'
back = bytes_text.decode('utf-8')
print(back) # ПриветStr b a в python 3 (префикс b для строк в python 3)
Ошибка: если кодировка при декодировании не совпадает с той, что использовалась при кодировании, возникает
Для проверки совместимости используйте аргумент UnicodeDecodeError. Всегда указывайте правильную кодировку (чаще всего utf-8).errors='ignore' или errors='replace'.Как работать с байтовыми данными из файлов?
При открытии файла в бинарном режиме ('rb' или 'wb') чтение/запись происходит в виде байтов, а не строк. Это необходимо для изображений, звука, архивов. Пример:with open('image.jpg', 'rb') as f:
raw = f.read(100) # первые 100 байт
print(raw[:10]) # b'\xff\xd8\xff\xe0...'
Python b string (строки с префиксом b в python)
Если открыть такой файл в текстовом режиме, Python попытается декодировать содержимое, что может привести к ошибкам.Распространённая ошибка: попытка записать
str в файл, открытый в бинарном режиме ('wb'). Возникает TypeError: a bytes-like object is required, not 'str'. Решение: предварительно кодировать строку через .encode().Как объединить байтовые строки и строки?
Прямая конкатенацияb'hello' + 'world' вызовет TypeError, так как типы разные. Нужно привести их к одному типу: либо преобразовать байты в строку (декодировать), либо строку в байты (закодировать). Пример:part1 = b'Hello '
part2 = 'World'
result = part1 + part2.encode('ascii')
print(result) # b'Hello World'Python b format (формат b в python)
Как использовать байты для работы с сетевыми протоколами?
Библиотеки вродеsocket ожидают данные в виде байтов. Пример отправки сообщения:import socket
sock = socket.socket()
sock.connect(('example.com', 80))
request = b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
sock.send(request)
response = sock.recv(1024) # bytes
print(response[:50])При разборе ответа часто используют метод .split() для байтов, но помните – разделитель тоже должен быть байтовым (например, b'\r\n').Как упаковать числа в байты (struct)?
Модульstruct позволяет преобразовывать числа и другие типы в байтовые последовательности фиксированной длины. Это важно для бинарных форматов данных. Пример:import struct
# упаковка целого 42 в 4 байта (little-endian)
packed = struct.pack('<i', 42)
print(packed) # b'*\x00\x00\x00'
# распаковка
unpacked = struct.unpack('<i', packed)
print(unpacked[0]) # 42Модуль struct требует строгого задания формата; ошибки при несовпадении длины приводят к struct.error.Как проверить, является ли переменная байтовой строкой?
Используйте встроенную функциюisinstance():value = b'abc'
if isinstance(value, bytes):
print('Это байты')
else:
print('Это строка или что-то ещё')Это помогает писать надёжный код, работающий с разными типами.Расширенные примеры работы с b-строками
Пример
# Пример 1: чтение EXIF из JPEG (первые 2 байта – сигнатура)
with open('photo.jpg', 'rb') as f:
header = f.read(2)
if header == b'\xff\xd8':
print('Это JPEG файл')
else:
print('Неизвестный формат')Это JPEG файл
Пример
# Пример 2: преобразование целого числа в байты и обратно с разным порядком байт
import struct
value = 1024
big = struct.pack('>I', value) # big-endian
little = struct.pack('<I', value) # little-endian
print(big) # b'\x00\x00\x04\x00'
print(little) # b'\x00\x04\x00\x00'
# распаковка
print(struct.unpack('>I', big)[0]) # 1024
print(struct.unpack('<I', little)[0])# 1024b'\x00\x00\x04\x00' b'\x00\x04\x00\x00' 1024 1024
Пример
# Пример 3: работа с бинарным протоколом (имитация записи переменной длины)
import struct
def encode_varint(value):
# простой вариант: 1 байт для значений <128
if value < 128:
return bytes([value])
else:
return struct.pack('>H', value) # 2 байта
packet = b'\x02' + encode_varint(100) # тип сообщения + длина
print(packet) # b'\x02d' (d = 100 в ASCII)b'\x02d'
Пример
# Пример 4: безопасное декодирование с игнорированием ошибок
raw = b'\xff\xfe\x00\x41'
try:
text = raw.decode('utf-8')
except UnicodeDecodeError:
text = raw.decode('utf-8', errors='ignore')
print(text) # 'A' (непечатные символы отброшены)A
Пример
# Пример 5: создание байтовой строки с помощью bytes()
# из списка целых чисел
bytes_from_list = bytes([72, 101, 108, 108, 111]) # 'Hello'
print(bytes_from_list) # b'Hello'
# из форматированной строки с эскейпами
bytes_with_escapes = b'line1\nline2\tindent'
print(bytes_with_escapes) # b'line1\nline2\tindent'b'Hello' b'line1\nline2\tindent'
Пример
# Пример 6: сравнение байтов и строк
byte_version = b'abc'
str_version = 'abc'
print(byte_version == str_version) # False – разные типы
print(byte_version.decode('ascii') == str_version) # TrueFalse True
Строки с префиксом b в Python - comments
En
Python b string (python)