Konvertieren Sie Bytes in String in Python: Ein Tutorial für Anfänger


Zeichenfolgen sind gängige integrierte Datentypen in Python. Aber manchmal müssen Sie möglicherweise stattdessen mit Bytes arbeiten. Lassen Sie uns lernen, wie man in Python Bytes in Strings umwandelt.

In Python sind Zeichenfolgen unveränderliche Zeichenfolgen, die für Menschen lesbar sind und normalerweise in einer bestimmten Zeichenkodierung wie UTF-8 kodiert sind. Während Bytes rohe Binärdaten darstellen. Ein Byteobjekt ist unveränderlich und besteht aus einem Array von Bytes (8-Bit-Werte). In Python 3 sind String-Literale standardmäßig Unicode, während Byte-Literalen ein b vorangestellt ist.

Das Konvertieren von Bytes in Strings ist eine häufige Aufgabe in Python, insbesondere bei der Arbeit mit Daten aus Netzwerkvorgängen, Datei-E/A oder Antworten von bestimmten APIs. Dies ist ein Tutorial zum Konvertieren von Bytes in Strings in Python.

1. Konvertieren Sie Bytes mit der Methode decode() in Strings

Der einfachste Weg, Bytes in einen String umzuwandeln, ist die Verwendung der Methode decode() für das Byte-Objekt (oder den Byte-String). Diese Methode erfordert die Angabe der verwendeten Zeichenkodierung.

Hinweis: Zeichenfolgen haben keine zugehörige Binärkodierung und Bytes haben keine zugehörige Textkodierung. Um Bytes in Strings umzuwandeln, können Sie die Methode decode() für das Bytes-Objekt verwenden. Und um einen String in Bytes umzuwandeln, können Sie die Methode encode() für den String verwenden. Geben Sie in jedem Fall die zu verwendende Kodierung an.

Beispiel 1: UTF-8-Kodierung

Hier konvertieren wir byte_data mit der Methode decode() in einen UTF-8-codierten String:

# Sample byte object
byte_data = b'Hello, World!'

# Converting bytes to string 
string_data = byte_data.decode('utf-8')

print(string_data)  

Sie sollten die folgende Ausgabe erhalten:

Output >>>
Hello, World!

Sie können die Datentypen vor und nach der Konvertierung wie folgt überprüfen:

print(type(bytes_data))
print(type(string_data))

Die Datentypen sollten wie erwartet sein:

Output >>>
<class 'bytes'>
<class 'str'>

Beispiel 2: Umgang mit anderen Kodierungen

Manchmal kann die Bytesequenz andere Codierungen als UTF-8 enthalten. Sie können dies umgehen, indem Sie das entsprechende Codierungsschema angeben, das verwendet wird, wenn Sie die Methode decode() für das Bytes-Objekt aufrufen.

So können Sie einen Byte-String mit der UTF-16-Kodierung dekodieren:

# Sample byte object 
byte_data_utf16 = b'\xff\xfeH\x00e\x00l\x00l\x00o\x00,\x00 \x00W\x00o\x00r\x00l\x00d\x00!\x00'

# Converting bytes to string 
string_data_utf16 = byte_data_utf16.decode('utf-16')

print(string_data_utf16)  

Und hier ist die Ausgabe:

Output >>>
Hello, World!

Verwendung von Chardet zur Erkennung der Codierung

In der Praxis kennen Sie möglicherweise nicht immer das verwendete Codierungsschema. Und nicht übereinstimmende Kodierungen können zu Fehlern oder verstümmeltem Text führen. Wie können Sie das also umgehen?

Sie können die Chardet-Bibliothek (install chardet using pip: pip install chardet) verwenden, um die Codierung zu erkennen. Und dann verwenden Sie es im Methodenaufruf „decode()“. Hier ist ein Beispiel:

import chardet

# Sample byte object with unknown encoding
byte_data_unknown = b'\xe4\xbd\xa0\xe5\xa5\xbd'

# Detecting the encoding
detected_encoding = chardet.detect(byte_data_unknown)
encoding = detected_encoding['encoding']
print(encoding)

# Converting bytes to string using detected encoding
string_data_unknown = byte_data_unknown.decode(encoding)

print(string_data_unknown) 

Sie sollten eine ähnliche Ausgabe erhalten:

Output >>>
你好 

Fehlerbehandlung bei der Dekodierung

Das bytes-Objekt, mit dem Sie arbeiten, ist möglicherweise nicht immer gültig; Es kann manchmal ungültige Sequenzen für die angegebene Kodierung enthalten. Dies führt zu Fehlern.

Hier enthält byte_data_invalid die ungültige Sequenz \xff:

# Sample byte object with invalid sequence for UTF-8
byte_data_invalid = b'Hello, World!\xff'

# try converting bytes to string 
string_data = byte_data_invalid.decode('utf-8')

print(string_data) 

Wenn Sie versuchen, es zu dekodieren, erhalten Sie die folgende Fehlermeldung:

Traceback (most recent call last):
  File "/home/balapriya/bytes2str/main.py", line 5, in 
	string_data = byte_data_invalid.decode('utf-8')
              	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 13: invalid start byte

Es gibt jedoch mehrere Möglichkeiten, mit diesen Fehlern umzugehen. Sie können solche Fehler beim Dekodieren ignorieren oder ungültige Sequenzen durch einen Platzhalter ersetzen.

Fehler ignorieren

Um ungültige Sequenzen beim Dekodieren zu ignorieren, können Sie die Fehler, die Sie errors setzen können, im Methodenaufruf decode() auf ignore setzen:

# Sample byte object with invalid sequence for UTF-8
byte_data_invalid = b'Hello, World!\xff'

# Converting bytes to string while ignoring errors
string_data = byte_data_invalid.decode('utf-8', errors='ignore')

print(string_data) 

Sie erhalten nun die folgende Ausgabe ohne Fehler:

Output >>>
Hello, World!

Fehler ersetzen

Sie können ungültige Sequenzen auch durch den Platzhalter ersetzen. Dazu können Sie errors wie gezeigt auf replace setzen:

# Sample byte object with invalid sequence for UTF-8
byte_data_invalid = b'Hello, World!\xff'

# Converting bytes to string while replacing errors with a placeholder
string_data_replace = byte_data_invalid.decode('utf-8', errors='replace')

print(string_data_replace)  

Jetzt wird die ungültige Sequenz (am Ende) durch einen Platzhalter ersetzt:

Output >>>
Hello, World!�

2. Konvertieren Sie Bytes mit dem str()-Konstruktor in einen String

Die Methode decode() ist die gebräuchlichste Methode zum Konvertieren von Bytes in Zeichenfolgen. Sie können aber auch den Konstruktor str() verwenden, um einen String aus einem Bytes-Objekt abzurufen. Sie können das Codierungsschema wie folgt an str() übergeben:

# Sample byte object
byte_data = b'Hello, World!'

# Converting bytes to string
string_data = str(byte_data,'utf-8')

print(string_data)

Dies gibt aus:

Output >>>
Hello, World!

3. Konvertieren Sie Bytes mithilfe des Codecs-Moduls in Zeichenfolgen

Eine weitere Methode zum Konvertieren von Bytes in Strings in Python ist die Verwendung der Funktion decode() aus dem integrierten Codecs-Modul. Dieses Modul bietet Komfortfunktionen zum Kodieren und Dekodieren.

Sie können die Funktion decode() mit dem Bytes-Objekt und dem Codierungsschema wie gezeigt aufrufen:

import codecs

# Sample byte object
byte_data = b'Hello, World!'

# Converting bytes to string
string_data = codecs.decode(byte_data,'utf-8')

print(string_data)  

Wie erwartet wird auch Folgendes ausgegeben:

Output >>>
Hello, World!

Zusammenfassung

In diesem Tutorial haben wir gelernt, wie man in Python Bytes in Strings umwandelt und gleichzeitig verschiedene Codierungen und potenzielle Fehler elegant handhabt. Konkret haben wir gelernt, wie man:

  • Verwenden Sie die Methode decode(), um Bytes in eine Zeichenfolge umzuwandeln und dabei die richtige Codierung anzugeben.
  • Behandeln Sie mögliche Dekodierungsfehler mithilfe des Parameters errors mit Optionen wie ignore oder replace.
  • Verwenden Sie den Konstruktor str(), um ein gültiges Byte-Objekt in einen String zu konvertieren.
  • Verwenden Sie die Funktion decode() aus dem Modul codecs, das in die Python-Standardbibliothek integriert ist, um ein gültiges Byte-Objekt in einen String zu konvertieren.

Viel Spaß beim Codieren!