bytes()
Die eingebaute Funktion bytes() erzeugt unveränderliche Byte-Sequenzen und ist zentral für die Arbeit mit binären Daten in Python — etwa bei Datei‑ und Netzwerk‑I/O, Kryptographie und Kodierungsaufgaben. bytes() lässt sich aus Integer‑Iterables, aus einem bytearray, aus einem Text‑String (mit angegebenem encoding) oder leer mit einer bestimmten Länge erstellen. Da bytes immutable sind, sind sie als schreibgeschützte Puffer und Schlüssel geeignet; für Änderungen muss man vorher in ein bytearray konvertieren. In diesem Artikel behandeln wir Syntax, Erzeugungswege, typische Encoding‑Fallstricke und praxisnahe Beispiele zur effizienten Verarbeitung von Binärdaten.
Inhaltsverzeichnis
Einführung
Die bytes Klasse ist einer der eingebauten Datentypen in Python und spielt eine zentrale Rolle bei der Arbeit mit Binärdaten. Sie repräsentiert unveränderliche (immutable) Sequenzen von Bytes und ist essentiell für die Verarbeitung von Rohdaten, Netzwerkkommunikation, Dateioperationen und der Interaktion zwischen verschiedenen Zeichenkodierungen.
Beschreibung
Was ist bytes?
Die bytes Klasse repräsentiert eine unveränderliche Sequenz von Bytes, wobei jedes Byte einen Wert zwischen 0 und 255 (8 Bit) haben kann. Im Gegensatz zu Strings, die Text in Unicode-Zeichen darstellen, arbeitet bytes mit rohen Binärdaten.
Welches Problem wird gelöst?
In der modernen Programmierung müssen wir häufig zwischen verschiedenen Datenrepräsentationen wechseln.
- Text vs. Binärdaten: Strings sind für Menschen lesbar, aber Computer arbeiten mit Bytes.
- Zeichenkodierungen: Verschiedene Systeme verwenden unterschiedliche Kodierungen (UTF-8, ASCII, Latin-1, etc.)
- Netzwerkkommunikation: Daten werden über Netzwerke als Byte-Streams übertragen.
- Dateioperationen: Binärdateien (Bilder, PDFs, etc.) müssen als Bytes verarbeitet werden.
- Kryptographie: Verschlüsselung und Hashing arbeiten mit Byte-Daten.
Syntax
Die bytes Klasse hat mehrere Konstruktor-Signaturen.
Die erste Signatur: Leer oder aus verschiedenen Quellen.
bytes(source=b"")Die zweite Signatur: Aus String mit Kodierung.
bytes(source, encoding, errors="strict")Zusätzliche Möglichkeiten:
bytes() # Leeres byte-Objekt
bytes(integer) # Bytes mit Nullen der angegebenen Länge
bytes(iterable) # Bytes aus iterierbarem Objekt
bytes(buffer) # Bytes aus Objekt mit Buffer-Protokoll
bytes(string, encoding) # Bytes aus String
bytes(string, encoding, errors) # Bytes aus String mit Fehlerbehandlungsource
Der source Parameter kann verschiedene Typen annehmen (siehe weiter unten)
encoding
Gibt die Zeichenkodierung an, die verwendet werden soll
errors
Definiert, wie mit Kodierungsfehlerns umgegangen werden soll
Parameter-Beschreibung
Im Folgenden werden die Parameter etwas genauer beschrieben/erklärt.
Parameter source
Dieser Parameter kann verschiedene Typen annehmen.
Keine Angabe oder b''
- Erzeugt ein leeres
bytesObjekt - Standard-Fallback-Wert
my_bytes = bytes()
my_bytes = bytes(b"")Integer
- Erzeugt ein
bytesObjekt der angegebenen Länge - Alle Bytes werden mit Nullen initialisiert
- Der Integer muss nicht-negativ sein
my_bytes = bytes(4) # b'\x00\x00\x00\x00'Iterable von Integers
- Jedes Element muss ein Integer zwischen 0 und 255 sein
- Erzeugt ein
bytesObjekt mit diesen Werten
bytes([2, 4, 6]) # b'\x02\x04\x06'String (nur mit Encoding)
- Wandelt einen String in Bytes um
- Erfordert den
encodingParameter - Der String wird gemäß der angegebenen Kodierung in Bytes übersetzt
my_bytes = bytes("Hello", "utf-8") # b'Hello'Objekt mit Buffer-Protokoll
- Andere
bytes,bytearrayoder buffer-unterstützende Objekte - Erstellt eine Kopie der Bytes
Parameter encoding
Dieser Parameter gibt die Zeichenkodierung an, die verwendet werden soll.
Folgende Werte sind unter Anderem möglich:
utf-8: Unicode-Kodierung (Standard für moderne Anwendungen)ascii: 7-Bit ASCII (nur 0-127)latin-1oderiso-8859-1: 8-Bit westeuropäische Zeichenutf-16,utf-32: Andere Unicode-Kodierungencp1252: Windows Western European
Viele weitere sind verfügbar.
Parameter errors
Mit diesem Parameter wird definiert, wie mit Kodierungsfehlern umgegangen werden soll.
Folgende Werte sind möglich:
strict: WirftUnicodeEncodeErrorbei ungültigen Zeichen (Standard)ignore: Ignoriert ungültige Zeichenreplace: Ersetzt ungültige Zeichen durch ein Ersatzzeichenxmlcharrefreplace: Ersetzt durch XML-Zeichen-Referenzbackslashreplace: Ersetzt durch Backslash-Escape-Sequenzennamereplace: Ersetzt durch\N{...}Escape-Sequenzen
Rückgabewert
Die bytes() Funktion gibt es unveränderliches bytes Objekt zurück.
Dieses Objekt:
- Ist eine Sequenz von Bytes (Werte 0 - 255)
- Ist immutable (unveränderlich)
- Kann indexiert und gesliced werden
- Unterstützt viele String-ähnliche Methoden
- Hat einen anderen Typ als
strundbytearray
Unveränderlichkeit
Ein bytes Objekt kann nach der Erstellung nicht mehr verändert werden. Dies unterscheidet es von bytearray, dem veränderbaren Pendant.
Dieses Unveränderlichkeit macht bytes hashbar (kann als Dictionary-Key verwendet werden) und thread-safe, führt aber dazu, dass jede “Änderung” ein neues Objekt erstellt.
b = bytes([60, 70, 80])
b[0]= 100TypeError: 'bytes' object does not support item assignmentLiteral-Syntax
Python bietet eine spezielle Literal-Syntax für bytes. Das b-Präfix vor einem String-Literal erzeugt direkt ein bytes Objekt. Nur ASCII-Zeichen (0-127) sind in Literalen erlaubt, andere Zeichen müssen escaped werden.
Das ist möglich.
b1 = b"Hallo Python"
b2 = b"Coding"
b3 = b"""Multi
line of
code"""
print(b1)
print(b2)
print(b3)b'Hallo Python'
b'Coding'
b'Multi\nline of\ncode'Hier kriegen wir einen Fehler aufgrund von ö.
b = b"Python is schön"SyntaxError: bytes can only contain ASCII literal charactersDarstellung und Ausgabe
Die String-Repräsentation von bytes zeigt lesbare ASCII-Zeichen als Text und andere als Hex-Werte.
b = bytes([72, 101, 108, 108, 111, 32, 255, 0, 10])
print(b)b'Hello \xff\x00\n'- ASCII-Zeichen (32-126) werden als Zeichen dargestellt. (
Hello) - Nicht-druckbare Zeichen als Hex:
\xff(255) und\x00(0)
Praktische Beispiele
Konvertierung zwischen bytes und str
Die Umwandlung zwischen Text (str) und Binärdaten (bytes) ist eine der häufigsten Operationen.
text = "Hallo Welt 🌍"
b1 = text.encode("utf-8")
print(b1)
b2 = bytes(text, "utf-8")
print(b2)
text_back = b1.decode("utf-8")
print(text_back)b'Hallo Welt \xf0\x9f\x8c\x8d'
b'Hallo Welt \xf0\x9f\x8c\x8d'
Hallo Welt 🌍Kurze Ausführungen zu diesem Beispiel.
- Das Emoji 🌍 wird in UTF-8 als 4 Bytes kodiert:
\xf0\x9f\x8c\x8d encode()ist eine String-Methode, währendbytes()ein Konstruktor istdecode()ist eine Umkehrung und wandelt Bytes zurück in String um- Beide Richtungen benötigen die Angabe einer Kodierung
Fehlerbehandlung
Nun schauen wir uns an, wie man mit Encoding-Fehlern umgehen kann.
Zuerst versuchen wir den Fehler abzufangen.
text = "Café"
try:
b = bytes(text, "ascii")
except UnicodeEncodeError as e:
print(f"Fehler: {e}")Fehler: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)Der Buchstabe é kann nicht mittels ASCII korrekt ausgegeben bzw. interpretiert werden. Deswegen wird hier der Fehler geworfen.
Im nächsten Beispiel schauen wir uns an, wie wir den Fehler einfach ignorieren können und nur das ausgeben, was korrekt verarbeitet werden kann.
text = "Café"
b_with_ignore = bytes(text, "ascii", errors="ignore")
print(b_with_ignore)b'Caf'Wie wir hier sehen, wir der Buchstabe é einfach ignoriert.
Wir können auch Zeichen, welche bei einer bestimmten Kodierung nicht korrekt verarbeitet werden, durch ein Zeichen ersetzen.
text = "Café"
b_with_replace = bytes(text, "ascii", errors="replace")
print(b_with_replace)b'Caf?s'Leere Objekte
Werfen wir einen Blick auf die Erstellung von leeren Objekten mit bytes().
b1 = bytes()
b2 = bytes(b"")
b3 = b""
print(b1)
print(len(b1))
print(b1 == b2 == b3)
print(type(b1))b''
0
True
<class 'bytes'>