Kurs
Wie man in Python Bytes in Strings umwandelt
Eine der weniger bekannten eingebauten Sequenzen in Python ist Bytes, eine unveränderliche Folge von ganzen Zahlen. Jede ganze Zahl steht für ein Byte an Daten. Daten werden in Netzwerken und Programmen oft als Bytes übertragen. Bytes sind nicht für Menschen lesbar und wir müssen sie in unseren Python-Programmen oft in Strings umwandeln.
In diesem Lernprogramm lernst du, wie du in Python Bytes in Strings umwandeln kannst. Wenn du dich für die umgekehrte Operation interessierst, schau dir meine Anleitung an, wie du in Python Strings in Bytes umwandelst.
Beginnen wir mit einer kurzen Antwort für diejenigen unter euch, die es eilig haben.
Kurze Antwort: Wie man in Python Bytes in Strings umwandelt
Das wichtigste Werkzeug zur Umwandlung von Bytes in Strings in Python ist die Methode .decode()
:
data = b"\xc3\xa9clair"
text = data.decode(encoding="utf-8")
print(text)
éclair
Die Methode .decode()
gibt einen String zurück, der das bytes
Objekt darstellt. In diesem Beispiel wird die UTF-8-Dekodierung verwendet. UTF-8 ist die Standardkodierung, daher ist sie im obigen Beispiel nicht erforderlich, aber wir können auch andere Kodierungen verwenden.
Verstehen von Bytes und Strings in Python
Python hat eine eingebaute bytes
Datenstruktur, die eine unveränderliche Folge von ganzen Zahlen im Bereich von 0 bis 255 ist. Eine ganze Zahl innerhalb dieses Bereichs von 256 Zahlen kann mit acht Datenbits dargestellt werden, was einem Byte entspricht. Daher ist jedes Element in einem bytes
Objekt eine Ganzzahl, die ein Byte darstellt.
Verwenden wir den bytes()
Konstruktor, um ein bytes
Objekt aus einer Liste zu erstellen:
data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(type(data))
<class 'bytes'>
Diese Folge von ganzen Zahlen ist unveränderlich:
data[0] = 100
Traceback (most recent call last):
...
data[0] = 100
~~~~^^^
TypeError: 'bytes' object does not support item assignment
Python gibt eine TypeError
aus, wenn wir versuchen, einen Wert innerhalb dieser Sequenz zu ändern. Lass uns bestätigen, dass ein bytes
Objekt nur ganze Zahlen im Bereich von 0 bis 255 enthalten kann:
data = bytes([254, 255, 256])
Traceback (most recent call last):
...
data = bytes([254, 255, 256])
^^^^^^^^^^^^^^^^^^^^^^
ValueError: bytes must be in range(0, 256)
Die ValueError
besagt, dass eine ganze Zahl, die ein Byte repräsentiert, ein Mitglied von range(0, 256)
sein muss. Das Ende des Bereichs wird ausgeschlossen, so wie es in Python bei einem Zahlenbereich üblich ist.
Wir können das Byte-Objekt mit print()
anzeigen:
data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data)
b'DataCamp'
Die Darstellung zeigt das bytes
Objekt, das durch Zeichen repräsentiert wird. Python zeigt die ganzen Zahlen mit den ASCII-Zeichen an, die diesen Werten entsprechen. Das Präfix b vor den Zeichen in Anführungszeichen zeigt, dass es sich um ein bytes
Objekt handelt.
Wir können auch ein bytes
Objekt erstellen, indem wir das Bytes-Literal direkt verwenden:
data = b"DataCamp"
print(data)
print(data[0])
b'DataCamp'
68
Das Objekt wird mit Zeichen dargestellt, aber seine Elemente sind ganze Zahlen.
Die Objekte von bytes
sind jedoch nur dann für Menschen lesbar, wenn sie ganze Zahlen verwenden, die druckbaren ASCII-Zeichen entsprechen. Da ASCII eine 7-Bit-Kodierung ist, enthält sie 128 Codes, aber nur 95 dieser ASCII-Zeichen sind druckbar.
Ganzzahlen zwischen 0 und 127, die kein druckbares ASCII-Zeichen haben, und Ganzzahlen zwischen 128 und 255 werden als Hexadezimalzahlen angezeigt:
data = bytes([0, 68, 97, 116, 97, 67, 97, 109, 112, 200])
print(data)
b'\x00DataCamp\xc8'
Die erste ganze Zahl in der Liste ist jetzt 0, was in ASCII kein druckbares Zeichen ist. Das Objekt bytes
zeigt diese Ganzzahl als \x00
an, die hexadezimale Darstellung von 0. Die letzte Ganzzahl ist 200, was außerhalb des ASCII-Bereichs liegt, aber innerhalb des Bereichs der Ganzzahlen, die in Bytes verwendet werden können. Python zeigt diese Ganzzahl als \xc8
an, was hexadezimal 200 entspricht.
Die Datenstrukturen bytes
und Strings haben gemeinsame Merkmale. Beide sind unveränderliche Sequenzen, aber bytes
enthält ganze Zahlen, während Strings Zeichen enthalten:
data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data[0])
text = "DataCamp"
print(text[0])
68
D
Bytes werden verwendet, um Daten über Netzwerke und zwischen verschiedenen Schnittstellen zu übertragen. Im nächsten Abschnitt dieses Artikels geht es darum, wie man Bytes in Strings umwandelt.
Konvertierung von Bytes in Strings: Die .decode()
Methode
Ein bytes
Objekt in Python ist nur dann für Menschen lesbar, wenn es lesbare ASCII-Zeichen enthält. Für die meisten Anwendungen reichen diese Zeichen nicht aus. Wir können ein bytes
Objekt mit der Methode .decode()
in eine Zeichenkette umwandeln:
data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
text = data.decode()
print(text)
print(type(text))
DataCamp
<class 'str'>
Es gibt jedoch verschiedene Kodierungen, um zwischen Bytes und Strings zu konvertieren. Die ganzen Zahlen im obigen Beispiel stellen druckbare ASCII-Zeichen dar. Die Standardkodierung, die verwendet wird, wenn kein Argument an .decode()
übergeben wird, ist jedoch UTF-8 und nicht ASCII. UTF-8 ist die am häufigsten verwendete Kodierung für Unicode-Zeichen.
Die ersten 128 UTF-8-Codes stimmen mit den ASCII-Codes überein, weshalb die Byte-Objektdaten im obigen Beispiel in die Zeichenfolge "DataCamp"
dekodiert werden.
Der Unicode enthält jedoch fast 150.000 Zeichen. UTF-8 kodiert alle Nicht-ASCII-Zeichen in Unicode mit zwei oder mehr Bytes.
Lass uns ein neues bytes
Objekt erstellen und es entschlüsseln:
data = bytes([195, 169])
print(data)
text = data.decode()
print(text)
b'\xc3\xa9'
é
Das Objekt bytes
enthält zwei Bytes: die Ganzzahlen 195 und 169. Python zeigt die hexadezimale Darstellung dieser Bytes an. .decode()
gibt jedoch einen String zurück, indem es das bytes
Objekt mit der UTF-8 Kodierung dekodiert. Das Bytepaar b'\xc3\xa9'
steht für den Buchstaben e mit einem akuten Akzent, é.
Die Methode .decode()
benötigt ein optionales Argument, um die Kodierung anzugeben:
text = data.decode("utf-8")
print(text)
é
UTF-8 ist die Standardkodierung, aber es können auch andere Kodierungen verwendet werden. Wir können auch eine Zeichenkette in ein bytes
Objekt umwandeln, indem wir die String-Methode .encode()
mit verschiedenen Kodierungen verwenden:
text = "éclair"
data = text.encode("utf-8")
print(data)
data = text.encode("utf-16")
print(data)
b'\xc3\xa9clair'
b'\xff\xfe\xe9\x00c\x00l\x00a\x00i\x00r\x00'
Ein und derselbe String wird in verschiedene bytes
Objekte umgewandelt, je nachdem, welche Zeichenkodierung wir verwenden.
Kodierungsfehler
Die Wahl der Zeichenkodierung kann zu Fehlern führen, wenn bei der Konvertierung zwischen Bytes und Strings eine andere Kodierung verwendet wird. Nehmen wir das Beispiel mit dem String "éclair"
, der mit der UTF-8-Kodierung in Bytes kodiert wurde:
text = "éclair"
data = text.encode("utf-8")
print(data)
b'\xc3\xa9clair'
Diese Folge von Bytes stellt Zeichen in der UTF-8-Kodierung dar. Die Methode .decode()
gibt einen Fehler aus, wenn wir die falsche Kodierung verwenden:
text = data.decode("ascii")
print(text)
Traceback (most recent call last):
...
text = data.decode("ascii")
^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Wir können jedoch das optionale Argument errors
einfügen, um eventuelle Fehler zu behandeln. Der Standardwert für den Parameter errors
ist "strict"
, der bei ungültigen Zeichen einen Fehler auslöst.
Die Methode .decode()
kann mit errors="ignore"
aufgerufen werden, um alle ungültigen Zeichen zu ignorieren:
text = data.decode("ascii", errors="ignore")
print(text)
clair
Das erste Zeichen in der ursprünglichen Zeichenkette ist é, was kein ASCII-Zeichen ist. Daher gibt .decode()
eine Zeichenkette ohne das erste Zeichen zurück.
Eine andere Möglichkeit ist, .decode()
mit errors="replace"
aufzurufen, wodurch ungültige Bytes durch � ersetzt werden:
text = data.decode("ascii", errors="replace")
print(text)
��clair
Diese Ausgabe zeigt, dass Zeichen in der Zeichenkette fehlen. Die Wahl der Fehlerbehandlung hängt von der Anwendung ab.
Konvertierung von Bytes in Strings mit str()
Die Methode .decode()
ist der Hauptweg, um Bytes in Strings umzuwandeln. Es ist aber auch möglich, den str()
Konstruktor direkt zu verwenden. Wenn du den str()
Konstruktor auf ein bytes
Objekt anwendest, wird eine String-Repräsentation der Rohbytes erstellt:
data = b'\xc3\xa9clair'
text = str(data)
print(text)
print(type(text))
b'\xc3\xa9clair'
<class 'str'>
Der str()
Konstruktor akzeptiert jedoch auch ein encoding
Argument, mit dem wir eine Zeichenkette auf der Grundlage einer bestimmten Kodierung erstellen können:
text = str(data, encoding='utf-8')
print(text)
éclair
Bytes in Strings umwandeln mit codecs.decode()
Das Modul codecs
in der Python-Standardbibliothek bietet die Schnittstelle für die Kodierung und Dekodierung von Daten. Dieses Modul bietet auch eine .decode()
Funktion, mit der du Python-Bytes in Strings umwandeln kannst:
import codecs
data = b'\xc3\xa9clair'
text = codecs.decode(data, encoding='utf-8')
print(text)
éclair
Diese alternativen Konvertierungstechniken sind keine Methoden vom Typ bytes
, sondern Funktionen, bei denen das bytes
Objekt als Argument übergeben werden muss.
Fazit
Daten werden oft als Bytes übertragen, und viele Python-Anwendungen müssen zwischen Bytes und Strings konvertieren. Ein bytes
Objekt ist eine unveränderliche Folge von Bytes, die mit einer von mehreren Zeichenkodierungen in eine string
umgewandelt werden kann.
Der wichtigste Weg, um Python-Bytes in eine Zeichenkette umzuwandeln, ist die Methode .decode()
, bei der du eine Kodierung und eine Strategie für die Fehlerbehandlung auswählen kannst.
Du kannst dein Python-Lernen mit den folgenden Tutorials und Kursen fortsetzen:
Ich habe Physik und Mathematik auf UG-Ebene an der Universität Malta studiert. Dann zog ich nach London und machte meinen Doktor in Physik am Imperial College. Ich habe an neuartigen optischen Techniken zur Abbildung der menschlichen Netzhaut gearbeitet. Jetzt konzentriere ich mich darauf, über Python zu schreiben, über Python zu kommunizieren und Python zu unterrichten.
Lerne Python mit diesen Kursen!
Kurs
Intermediate Python
Kurs