Mit der Einführung von Python 3 wurde der Typ bytes zum Haupttyp für die Speicherung und Verarbeitung von Binärdaten, getrennt von Zeichenfolgen (str). In Python 2 konnten Zeichenfolgen (str) sowohl Text als auch Bytes enthalten, was häufig zu Fehlern bei der Verarbeitung von Daten in verschiedenen Kodierungen führte.
In der alltäglichen Programmierung sind wir oft mit Aufgaben konfrontiert, die die Übertragung und Speicherung von Daten außerhalb des Kontexts von Textinformationen betreffen — zum Beispiel bei der Arbeit mit Dateien, Netzwerkanfragen und Austauschprotokollen. Hierfür wird ein klarer, bequemer und sicherer Typ benötigt, der Bytefolgen von Zeichendaten deutlich unterscheidet.
Der Typ bytes in Python speichert eine unveränderliche Folge von Bytes (Ganzzahlen von 0 bis 255) und kann aus einem Byte-Literal (mit dem Präfix b) oder durch explizite Typumwandlung erstellt werden. Um eine sichere und vorhersehbare Interaktion zwischen Zeichenfolgen (str) und Bytes (bytes) zu gewährleisten, werden die Methoden .encode() und .decode() verwendet. Bei der Arbeit mit Dateien, Netzwerken und verschiedenen Binärprotokollen ist bytes die Hauptwahl.
Beispielcode:
# Erstellung eines bytes-Objekts b = b'hello' # Durch Literale b2 = bytes([104, 101, 108, 108, 111]) # Aus einer Liste von Ganzzahlen # Umwandlung str <=> bytes text = 'Text' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Beispiel mit einer Datei with open('file.bin', 'rb') as f: data = f.read() # data: bytes
Wesentliche Merkmale:
Kann man bytes und str in einer Variablen konkatenieren?
Nein, das Verketten mit + oder f-Strings funktioniert nicht: Wenn man versucht, b'abc' + 'def' auszuführen, tritt ein TypeError auf. Typen müssen explizit umgewandelt werden.
Was unterscheidet bytes von bytearray?
bytes ist ein unveränderlicher Typ, das heißt, der Inhalt kann nach der Erstellung nicht mehr geändert werden. bytearray ist die veränderliche Variante und unterstützt Methoden zur Änderung von Bytes vor Ort.
b = bytes([1, 2, 3]) # immutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # OK b[0] = 99 # TypeError
Wie erfährt man, wie viele Bytes eine Zeichenfolge bei der Konvertierung über encode() benötigen wird?
Die Anzahl der Bytes hängt von der Kodierung ab. Zum Beispiel, für 'abc' in utf-8 sind das 3 Bytes, und 'Hallo' — 12. Erst nach dem Aufruf von encode() kann die genaue Größe über len() ermittelt werden:
s = 'Hallo' # 6 Buchstaben b = s.encode('utf-8') # 12 Bytes print(len(b)) # 12
Ein Entwickler liest eine Datei im Modus 'rb' (byte-wise) und versucht sie sofort als Zeichenfolge zu verarbeiten:
with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes
Vorteile:
Nachteile:
Ein Entwickler verarbeitet Byte-Streams über decode(), führt eine Kontrolle der Kodierung ein:
with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())
Vorteile:
Nachteile: