Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen None- und Binärdaten | Interaktionen Zwischen Datentypen
Datentypen in Python

None- und Binärdaten

Swipe um das Menü anzuzeigen

Reale Programme verarbeiten fehlende Werte und Binärdaten. None kennzeichnet "kein Wert", während bytes/bytearray für rohe Binärinhalte verwendet werden. Verstehen, wann welcher Typ geeignet ist und wie eine sichere Umwandlung zwischen Text und Bytes erfolgt.

None für "Kein Wert"

None ist ein einzelnes Objekt, das "nichts vorhanden" bedeutet.

1234567
result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")

Verwendung von is None anstelle von Wahrheitswertprüfungen, da auch 0 und "" als falsey gelten.

123
value = 0 print(not value) # True print(value is None) # False

Standardwerte und Rückfalloptionen

None wird als eindeutiger Marker verwendet, dass ein Wert absichtlich fehlt. Dadurch lässt sich zwischen „kein Wert angegeben“ und gültigen Werten wie 0 oder "" unterscheiden, was Standardwerte und Rückfalloptionen sicherer und vorhersehbarer macht.

1234567
x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0

Funktionen und Parameter

Dieses Beispiel zeigt, wie eine Funktion einen auf None gesetzten Parameter als Signal verwendet, dass kein Tag angegeben wurde. Dadurch kann die Funktion einen sicheren Standardwert zuweisen, während der Aufrufer ihn bei Bedarf überschreiben kann.

1234567
def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello

Binärdaten

str enthält Text, bytes und bytearray enthalten rohe Bytewerte.

1234
b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65

Kodierung und Dekodierung

Kodierung wandelt Text in Bytes um, damit er zuverlässig gespeichert oder übertragen werden kann, während Dekodierung diese Bytes wieder in lesbaren Text zurückverwandelt. Die Verwendung einer definierten Kodierung wie UTF-8 stellt sicher, dass Zeichen korrekt erhalten bleiben.

123
text = "café" data = text.encode("utf-8") back = data.decode("utf-8")

Binärdaten in der Praxis

Verwendung von bytes und bytearray zur Verarbeitung von rohen Binärinformationen. Diese Typen sind unerlässlich für Aufgaben, bei denen es sich nicht nur um Text handelt, wie zum Beispiel:

  • Lesen und Schreiben von Dateien im Binärmodus (wie Bilder, Audiodateien oder ausführbare Dateien);
  • Senden und Empfangen von Daten über Netzwerke, bei denen exakte Bytefolgen übertragen werden müssen;
  • Parsen oder Erstellen von Binärprotokollen, beispielsweise bei der Kommunikation mit Hardware oder Low-Level-APIs.

bytes vs bytearray

  • bytes-Objekte sind unveränderlich: Ihr Inhalt kann nach der Erstellung nicht mehr geändert werden. Verwendung bei festen Binärdaten, wie Dateiinhalten oder kryptografischen Hashes;
  • bytearray-Objekte sind veränderlich: Ihr Inhalt kann nachträglich geändert werden. Nützlich zum Erstellen oder Bearbeiten von Binärdaten vor dem Speichern oder Senden.

Beispiel: Bearbeiten von Binärdaten

# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72  # Change 'h' (104) to 'H' (72)
print(data_mutable)  # bytearray(b'Hello')

Umwandlung zwischen bytes und bytearray

  • Umwandlung von bytes in bytearray, um Änderungen zu ermöglichen:
b = b"data"
ba = bytearray(b)
  • Umwandlung von bytearray zurück in bytes zur Speicherung oder Übertragung:
ba = bytearray(b"abc")
b = bytes(ba)

Kodierung und Dekodierung

  • Verwendung von .encode() bei einem String, um ein bytes-Objekt mit einer bestimmten Kodierung (wie UTF-8) zu erhalten;
  • Verwendung von .decode() bei einem bytes- oder bytearray-Objekt, um einen String zu erhalten.

Dies ist entscheidend bei Datei-I/O oder Netzwerkdaten, bei denen häufig rohe Bytes empfangen oder gesendet und in lesbaren Text umgewandelt werden müssen.

Typische Anwendungsfälle

  • Datei-I/O:
    • Öffnen von Dateien im Binärmodus ("rb" oder "wb"), um exakte Bytes zu lesen oder zu schreiben.
  • Netzwerkdaten:
    • Socket-Kommunikation sendet und empfängt Daten als Bytes.
  • Binärprotokolle:
    • Erstellen oder Parsen von Paketen mit bytearray für effiziente Bearbeitungen im Speicher.

Das Verständnis, wann welcher Typ verwendet werden sollte, hilft beim Schreiben robuster Programme für die Verarbeitung realer Daten.

Typische Anwendungsfälle für Bytes und Bytearray

bytes und bytearray werden verwendet, wenn direkt mit rohen Binärdaten gearbeitet wird, anstatt mit Text. Diese Typen sind in mehreren Szenarien unerlässlich:

  • Lesen oder Schreiben von Binärdateien, wie Bilder, Audiodateien oder ausführbare Dateien;
  • Verarbeitung von Netzwerkdaten, da Sockets Bytes und keine Strings senden und empfangen;
  • Interaktion mit Binärprotokollen, bei denen Nachrichten als Bytefolgen erstellt oder geparst werden müssen.

bytes ist eine unveränderliche Sequenz, das heißt, der Inhalt kann nach der Erstellung nicht mehr geändert werden. Dies ist ideal, wenn sichergestellt werden muss, dass die Daten unverändert bleiben, zum Beispiel beim Lesen einer Datei oder beim Empfangen eines Netzwerkpakets.

bytearray ist veränderlich, sodass der Inhalt nachträglich geändert werden kann. Verwendung von bytearray, wenn eine Nachricht aufgebaut, Teile eines Puffers geändert oder Binärdaten effizient bearbeitet werden müssen, bevor sie gesendet oder gespeichert werden.

Wann welcher Typ verwendet wird:

  • Verwendung von bytes für feste, schreibgeschützte Binärdaten, wie Dateiinhalte oder Netzwerk-Nachrichten, die nicht geändert werden müssen;
  • Verwendung von bytearray, wenn Binärdaten bearbeitet, ergänzt oder vor der weiteren Verarbeitung oder Übertragung geändert werden müssen.

Umwandlung zwischen bytes und bytearray

Die Umwandlung zwischen bytes (unveränderlich) und bytearray (veränderlich) ist in Python einfach möglich. So kann der passende Typ für den jeweiligen Anwendungsfall gewählt werden—bytes für feste Daten, bytearray wenn der Inhalt bearbeitet werden muss.

  • Mit dem Konstruktor bytes() wird ein bytearray in ein unveränderliches bytes-Objekt umgewandelt;
  • Mit dem Konstruktor bytearray() wird aus einem bytes-Objekt eine veränderliche Kopie erstellt.

Dies ist nützlich, wenn Binärdaten bearbeitet werden müssen (mit bytearray), die anschließend (mit bytes) für eine sichere Speicherung oder Übertragung festgeschrieben werden.

raw = bytearray(b"data")
raw[0] = 68  # Change first byte to 'D'
locked = bytes(raw)  # Convert to immutable bytes

b = b"example"
mutable = bytearray(b)  # Convert to mutable bytearray
mutable.append(33)      # Add '!' (ASCII 33)

Nach der Umwandlung in bytes kann der Inhalt nicht mehr geändert werden. Verwendung von bytearray, wenn Binärdaten vor der finalen Umwandlung in bytes bearbeitet werden müssen.

1234567891011
# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456
try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")

Längenunterschiede

Einige Zeichen belegen ein Textelement, aber mehrere Bytes, sodass sich ihre Länge in str und in kodierter Form unterscheiden kann. Dies liegt daran, dass Kodierungen wie UTF-8 mehr als ein Byte benötigen können, um ein einzelnes Zeichen darzustellen.

123
ch = "é" len(ch) # 1 len(ch.encode()) # 2

Dateien

Binärdateien müssen im Modus "rb" geöffnet werden, damit ihre Rohbytes exakt wie gespeichert gelesen werden. Dies verhindert, dass Python versucht, die Daten als Text zu interpretieren.

# with open("example.png", "rb") as f:
#     blob = f.read()
question mark

Welche Überprüfung erkennt einen fehlenden Wert korrekt?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 3

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 4. Kapitel 3
some-alt