Met de komst van Python 3 is het type bytes de primaire manier geworden voor het opslaan en verwerken van binaire gegevens, gescheiden van strings (str). In Python 2 konden strings (str) zowel tekst als bytes bevatten, wat vaak leidde tot fouten bij het verwerken van gegevens in verschillende coderingen.
In de alledaagse programmering komen we vaak taken tegen die om gegevensoverdracht en -opslag buiten de context van tekstuele informatie vragen — bijvoorbeeld, werken met bestanden, netwerkaanvragen en communicatieprotocollen. Dit vereist een expliciete, handige en veilige type dat duidelijk de reeks bytes van stringgegevens onderscheidt.
Het bytes-type in Python slaat een onveranderlijke reeks bytes (gehele getallen van 0 tot 255) op en kan worden gemaakt uit een byte-literal (met de prefix b) of via expliciete typeconversie. Voor veilige en voorspelbare interactie tussen strings (str) en bytes (bytes) worden de methoden .encode() en .decode() gebruikt. Bij het werken met bestanden, netwerken en verschillende binaire protocollen is bytes de belangrijkste keuze.
Voorbeeldcode:
# Creëren van een bytes-object b = b'hello' # Via literal b2 = bytes([104, 101, 108, 108, 111]) # Uit lijst van gehele getallen # Conversie str <=> bytes text = 'tekst' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Voorbeeld met bestand with open('file.bin', 'rb') as f: data = f.read() # data: bytes
Belangrijke kenmerken:
Kan je bytes en str samengevoegen in één variabele?
Nee, samenvoegen met + of f-strings werkt niet: als je probeert b'abc' + 'def' uit te voeren, krijg je een TypeError. Je moet de types expliciet omzetten.
Wat is het verschil tussen bytes en bytearray?
bytes is een onveranderlijk type, dat wil zeggen, de inhoud kan niet worden gewijzigd na creatie. bytearray is een wijzigbaar alternatief, dat de methoden ondersteunt voor het wijzigen van bytes ter plaatse.
b = bytes([1, 2, 3]) # immutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # OK b[0] = 99 # TypeError
Hoe weet je hoeveel bytes een string in beslag neemt bij conversie via encode()?
Aantal bytes hangt af van de codering. Bijvoorbeeld, voor 'abc' in utf-8 zijn dat 3 bytes, terwijl 'Привет' — 12. Pas na het aanroepen van encode() kan je de exacte grootte weten via len():
s = 'Привет' # 6 letters b = s.encode('utf-8') # 12 bytes print(len(b)) # 12
Een ontwikkelaar leest een bestand in modus 'rb' (binaire) en probeert het onmiddellijk als string te verwerken:
with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes
Voordelen:
Nadelen:
Een ontwikkelaar verwerkt byte-stromen via decode(), voert controle van codering in:
with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())
Voordelen:
Nadelen: