Wie man in Python 2 und Python 3 Bytes in Strings konvertiert

  1. Bytes in String konvertieren in Python 2.x
  2. Bytes in String konvertieren in Python 3.x
  3. Leistungsvergleich und Schlußfolgerung verschiedener Methoden zur Konvertierung von Bytes in Strings

Dieser Tutorial-Artikel stellt vor, wie man in Python 2.x und Python 3.x bytes in Strings konvertiert.

Bytes in String konvertieren in Python 2.x

bytes in Python 2.7 ist identisch mit str, daher ist die Variable, die als bytes initiiert wird, die eigentliche Zeichenkette.

Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
'cd'
>>> type(A)
<type 'str'>

Bytes in String konvertieren in Python 3.x

bytes ist ein neuer Datentyp, der in Python 3 eingeführt wurde.

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
b'cd'
>>> type(A)
<class 'bytes'>
>>> 

Der Datentyp der Elemente in den bytes ist int.

>>> A = b'cd'
>>> A[0]
99
>>> type(A[0])
<class 'int'>

Bytes in String konvertieren mit Hilfe von decode in Python 3.x

Die .decode Methode von bytes könnte Bytes mit der angegebenen encoding Methode in String konvertieren. Es ist in den meisten Fällen in Ordnung, wenn Sie die encoding-Methode als Standard utf-8 belassen, aber es ist nicht immer sicher, da die Bytes mit einer anderen Encoding-Methode statt utf-8 verschlüsselt werden könnten.

>>> b'\x50\x51'.decode()
'PQ'
>>> b'\x50\x51'.decode('utf-8')
'PQ'
>>> b'\x50\x51'.decode(encoding = 'utf-8')
'PQ'

Die drei Wege, die bytes wie oben gezeigt zu dekodieren, sind identisch, weil utf-8 als Kodierungsmethode verwendet wird.

Es könnte zu Fehlern führen, wenn utf-8 verwendet wird, aber die Bytes nicht mit dieser Methode kodiert werden.

>>> b'\x50\x51\xffed'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    b'\x50\x51\xffed'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

Wir erhalten den UnicodeDecodeError, der besagt, dass utf-8 nicht der richtige Codec ist.

Wir haben zwei Ansätze, um dieses Codierungsproblem zu lösen.

backslashreplace, ignore oder replace als Parameter für error

decode hat den anderen Parameter neben encoding - errors. Er definiert das Verhalten, wenn ein error auftritt. Der Standardwert von errors ist strict, d.h. es wird ein Fehler ausgelöst, wenn der Fehler im Dekodierungsprozess auftritt.

error hat andere Optionen wie ignore, replace oder andere registrierte codecs.register_error Namen, backslashreplace zum Beispiel.

ignore ignoriert die falschen Dekodierungsfehler und erzeugt die Ausgabezeichenkette so, wie es geht.

replace ersetzt die entsprechenden Zeichen mit den Zeichen, die in der encoding Methode wie angegeben definiert sind. backslashreplace ersetzt die Zeichen, die nicht dekodiert werden konnten, mit dem gleichen Inhalt wie in den originalen bytes.

>>> b'\x50\x51\xffed'.decode('utf-8', 'backslashreplace')
'PQ\\xffed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'ignore')
'PQed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'replace')
'PQ�ed'

Die MS-DOS cp437-Kodierung könnte verwendet werden, wenn die Kodierung der bytes-Daten unbekannt ist.

>>> b'\x50\x51\xffed'.decode('cp437')
'PQ\xa0ed'

chr um die Bytes in Python 3.x in einen String zu konvertieren

chr(i, /) gibt einen Unicode-String aus einem Zeichen mit Ordinalzeichen zurück. Es könnte das Element von bytes in einen String konvertieren, aber nicht die kompletten bytes.

Wir könnten List Comprehensions oder map benutzen, um die konvertierte Zeichenkette von bytes zu erhalten, während wir chr für einzelne Elemente verwenden.

>>> A =  b'\x50\x51\x52\x53'
>>> "".join([chr(_) for _ in A])
'PQRS'
>>> "".join(map(chr, A))
'PQRS'

Leistungsvergleich und Schlußfolgerung verschiedener Methoden zur Konvertierung von Bytes in Strings

Wir verwenden timeit, um die Leistung der in diesem Tutorial vorgestellten Methode - decode und chr - zu vergleichen.

>>> import timeit
>>> timeit.timeit('b"\x50\x51\x52\x53".decode()', number=1000000)
0.1356779
>>> timeit.timeit('"".join(map(chr, b"\x50\x51\x52\x53"))', number=1000000)
0.8295201999999975
>>> timeit.timeit('"".join([chr(_) for _ in b"\x50\x51\x52\x53"])', number=1000000)
0.9530071000000362

Sie konnten an der oben gezeigten Zeitperformance sehen, dass decode() viel schneller und chr() relativ ineffizient ist, weil es den String aus dem einzelnen String-Zeichen rekonstruieren muss.

Wir empfehlen die Verwendung von decode in der performance-kritischen Anwendung.

Verwandter Artikel - Python Bytes

  • Hex in Byte umwandeln in Python
  • Verwandter Artikel - Python Encoding-Decoding

  • So konvertieren Sie Int in Binär in Python
  • Verwandter Artikel - Python String

  • Eine Zeichenkette nach Leerzeichen aufteilen in Python
  • Überprüfen Sie, ob ein String in Python ein Palindrom ist