Статьи

Учебные материалы по языку Python — от основ до продвинутых тем

bytes, bytearray и memoryview

Страница 24 из 34 · 2026-10-26 · 3 мин чтения

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

strbytes
СодержимоеСимволы UnicodeЧисла 0..255
Элемент при индексацииСтрока из одного символаint
Преобразованиеencodedecode
Неявное сравнение"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))

Задания

  1. Напишите функцию, превращающую строку в шестнадцатеричное представление без hex().
  2. Прочитайте первые 8 байт PNG-файла и проверьте сигнатуру.
  3. Упакуйте через struct запись из имени (фиксированные 10 байт) и возраста (1 байт).