Wie man in Python 2 und Python 3 Bytes in Strings konvertiert
- Bytes in String konvertieren in Python 2.x
- Bytes in String konvertieren in Python 3.x
- 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.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn FacebookVerwandter Artikel - Python Bytes
- Wie man Bytes in Ganzzahlen konvertiert in Python
- Wie man Int in Bytes konvertiert in Python 2 und Python 3
- So konvertieren Sie Int in Binär in Python
- Wie man String in Bytes in Python konvertiert
- B vor einer Zeichenkette in Python
Verwandter Artikel - Python String
- Entfernen Kommas aus String in Python
- Wie man prüft, ob eine Zeichenkette auf pythonische Weise leer ist
- Konvertieren einer Zeichenkette in einen Variablennamen in Python
- Wie man Leerzeichen in einem String in Python entfernt
- Wie man in Python Zahlen aus einer Zeichenkette extrahiert
- Wie man in Python String in datetime konvertiert