bytes
bytes — неизменяемая последовательность целых чисел от 0 до 255:
a = b"hello"b = bytes([72, 101, 108])c = bytes(4)d = "Привет".encode("utf-8")e = bytes.fromhex("48 65 6c 6c 6f")print(a)print(b)print(c)print(e)Литерал b"..." допускает только ASCII-символы и escape-последовательности вроде \x00.
Доступ
data = b"abc"print(data[0])print(data[0:2])print(list(data))print(len(data))print(b"b" in data)print(98 in data)Индекс возвращает целое число, а срез — снова bytes.
Методы bytes
Методы bytes и bytearray повторяют методы str, но работают с байтами:
| Группа | Методы |
|---|---|
| Поиск | find, rfind, index, rindex, count, startswith, endswith |
| Преобразование | replace, strip, lstrip, rstrip, removeprefix, removesuffix, translate, maketrans |
| Разбиение | split, rsplit, splitlines, partition, rpartition, join |
| Регистр | lower, upper, capitalize, title, swapcase |
| Проверки | isalnum, isalpha, isascii, isdigit, islower, isupper, isspace, istitle |
| Выравнивание | center, ljust, rjust, zfill, expandtabs |
| Специфичные | decode, hex, fromhex |
data = b"Hello"print(data.upper())print(data.hex())print(data.hex(":"))print(data.decode("ascii"))print(data.split(b"l"))bytearray
bytearray — изменяемый аналог bytes:
buf = bytearray(b"hello")buf[0] = 72buf.append(33)buf.extend(b"??")buf.insert(1, 65)print(buf)buf.pop()buf.remove(63)buf.reverse()buf.clear()К методам bytes добавляются изменяющие методы списков: append, extend, insert, pop, remove, reverse, clear, copy.
Преобразование между типами:
b = bytes(bytearray(b"abc"))ba = bytearray(b"abc")Сравнение bytes и str
str | bytes | |
|---|---|---|
| Содержимое | Символы Unicode | Числа 0..255 |
| Элемент при индексации | Строка из одного символа | int |
| Преобразование | encode | decode |
| Неявное сравнение | "a" == b"a" равно False |
Модуль struct
Упаковка и распаковка значений в двоичные структуры:
import structpacked = struct.pack("<IHb", 1000, 7, -1)print(packed)print(struct.unpack("<IHb", packed))print(struct.calcsize("<IHb"))Коды формата: b/B — 1 байт, h/H — 2, i/I — 4, q/Q — 8, f — float, d — double, s — байтовая строка. Первый символ определяет порядок байт: < little-endian, > big-endian.
memoryview
memoryview даёт доступ к буферу объекта без копирования данных:
data = bytearray(b"abcdef")view = memoryview(data)print(view[0])print(bytes(view[1:3]))view[0] = ord("X")print(data)sub = view[2:4]sub[0] = ord("Z")print(data)Срез memoryview не копирует данные, а ссылается на тот же буфер. Это полезно для работы с большими бинарными данными и сокетами.
Атрибуты и методы memoryview
| Элемент | Описание |
|---|---|
tobytes() | Копия в bytes |
tolist() | Список значений |
cast(format) | Переинтерпретация формата |
release() | Освобождает буфер |
nbytes, itemsize, format, shape, readonly | Свойства |
raw = bytearray(8)ints = memoryview(raw).cast("I")ints[0] = 1ints[1] = 2print(raw)print(ints.tolist())base64
import base64encoded = base64.b64encode(b"hello")print(encoded)print(base64.b64decode(encoded))Задания
- Напишите функцию, превращающую строку в шестнадцатеричное представление без
hex(). - Прочитайте первые 8 байт PNG-файла и проверьте сигнатуру.
- Упакуйте через
structзапись из имени (фиксированные 10 байт) и возраста (1 байт).
