Einführung
In diesem Artikel sehen wir uns an, wie man in Python Bytes in einen String umwandelt. Am Ende dieses Artikels werden Sie eine klare Vorstellung davon haben, was diese Typen sind und wie Sie damit effektiv mit Daten umgehen können.
Abhängig von der Version von Python, die Sie verwenden, wird sich diese Aufgabe unterscheiden. Obwohl Python 2 sein Lebensende erreicht hat, wird es in vielen Projekten immer noch verwendet, daher werden wir sowohl den Ansatz von Python 2 als auch den von Python 3 einbeziehen.
Bytes in String umwandeln in Python 3
Seit Python 3 musste die alte ASCII-Methode weichen, und Python wurde komplett auf Unicode umgestellt.
Das bedeutet, dass wir den expliziten Unicode-Typ verloren haben: u"string"
– jeder String ist ein u"string"
!
Um diese Strings von den guten alten Bytestrings zu unterscheiden, haben wir einen neuen Spezifizierer für sie eingeführt – das b"string"
.
Dies wurde in Python 2.6, aber es diente keinem anderen Zweck als der Vorbereitung auf Python 3, da in 2.6 alle Strings Bytestrings waren.
Bytestrings in Python 3 heißen offiziell bytes
, eine unveränderliche Folge von Ganzzahlen im Bereich 0 <= x < 256. Ein weiteres bytes
-ähnliches Objekt, das in 2.6 hinzugefügt wurde, ist das bytearray
– ähnlich wie bytes
, aber veränderbar.
Bytes in String umwandeln mit decode()
Schauen wir uns an, wie wir Bytes in einen String umwandeln können, indem wir die eingebaute decode()
-Methode für die Klasse bytes
verwenden:
Anhand des Kodierungsformats haben wir das bytes
-Objekt in einen String dekodiert und ausgegeben.
Bytes in String umwandeln mit Codecs
Alternativ können wir auch das eingebaute codecs
-Modul für diesen Zweck verwenden:
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
Der Parameter Encoding muss nicht zwingend übergeben werden, es ist aber ratsam, ihn zu übergeben:
>>> codecs.decode(b)"Let's grab a 🍕!"
Bytes in String umwandeln mit str()
Schließlich können Sie die Funktion str()
verwenden, die verschiedene Werte akzeptiert und in Strings umwandelt:
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
Stellen Sie aber sicher, dass Sie das Encoding-Argument an str()
übergeben, sonst könnten Sie unerwartete Ergebnisse erhalten:
>>> str(b)b'Lets grab a \xf0\x9f\x8d\x95!'
Damit kommen wir wieder zu den Encodings. Wenn Sie die falsche Kodierung angeben, stürzt Ihr Programm im besten Fall ab, weil es die Daten nicht dekodieren kann. Wenn wir zum Beispiel versuchen würden, die Funktion str()
mit UTF-16
zu verwenden, würden wir folgendes erhalten:
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
Dies ist umso wichtiger, als dass Python 3 gerne Unicode voraussetzt – wenn Sie also mit Dateien oder Datenquellen arbeiten, die eine obskure Kodierung verwenden, sollten Sie besonders aufmerksam sein.
Bytes in String umwandeln in Python 2
In Python 2 sind ein Bündel von Bytes und ein String praktisch dasselbe – Strings sind Objekte, die aus 1 Byte langen Zeichen bestehen, was bedeutet, dass jedes Zeichen 256 Werte speichern kann. Deshalb werden sie manchmal auch Bytestrings genannt.
Das ist großartig, wenn man mit Byte-Daten arbeitet – wir laden sie einfach in eine Variable und schon sind wir bereit zum Drucken:
>>> s = "Hello world!">>> s'Hello world!'>>> len(s)12
Die Verwendung von Unicode-Zeichen in Bytestrings ändert dieses Verhalten allerdings ein wenig:
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
Bytes in Unicode umwandeln (Python 2)
Hier müssen wir den in Python 2 verwendeten Unicode
Typ verwenden, der in Python 3 vorausgesetzt und automatisch verwendet wird. Dieser speichert Zeichenketten als eine Reihe von Codepunkten und nicht als Bytes.
Das \xf0\x9f\x8d\x95
stellt Bytes als zweistellige Hex-Zahlen dar, da Python nicht weiß, wie man sie als ASCII-Zeichen darstellt:
>>> u = u"Let's grab a 🍕!"u"Let's grab a \U0001f355!"">>> u"Let's grab a 🍕!"# Yum.>>> len(u)15
Wie Sie oben sehen können, enthält die Unicode-Zeichenkette \U0001f355
– ein Unicode-Escaped-Zeichen, das unser Terminal nun als Pizzastück auszugeben weiß! Dies zu setzen war so einfach wie die Verwendung des u
-Spezifizierers vor dem Wert des Bytestrings.
So, wie schalte ich zwischen den beiden um?
Sie können den Unicode-String erhalten, indem Sie Ihren Bytestring dekodieren. Dies kann geschehen, indem Sie ein Unicode-Objekt konstruieren, den Bytestring und eine Zeichenkette, die den Kodierungsnamen enthält, als Argumente bereitstellen oder indem Sie .decode(encoding)
auf einem Bytestring aufrufen.
Bytes in String umwandeln mit decode() (Python 2)
Sie können auch das codecs.encode(s, encoding)
aus dem Modul codecs
verwenden.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Bytes in String umwandeln mit Codecs (Python 2)
Oder mit dem Modul codecs
:
import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
Achten Sie auf die Kodierung
Ein Wort der Vorsicht an dieser Stelle – Bytes können in verschiedenen Kodierungen unterschiedlich interpretiert werden. Bei etwa 80 verschiedenen Kodierungen, die von Haus aus zur Verfügung stehen, ist es nicht einfach zu wissen, ob man die richtige hat!
Die ursprüngliche Nachricht war entweder øç
oder јч
, und beide scheinen gültige Konvertierungen zu sein.
Fazit
Als Programmierer gibt es einige Dinge, an die wir ständig denken und auf die wir uns aktiv vorbereiten müssen, um Fallstricke zu vermeiden. Das gilt besonders für die unteren Ebenen, in die wir uns selten begeben, wenn wir eine Hochsprache wie Python als unseren täglichen Fahrer benutzen.
Dinge wie Zeichensätze, Kodierungen und Binärcode sind dazu da, uns daran zu erinnern, dass unsere Aufgabe darin besteht, zu kodieren – unsere Gedanken in funktionierende Lösungen zu kodieren. Glücklicherweise wird ein Großteil dieses Denkens nach ein paar Runden an der Tastatur Teil unserer Routine.
In diesem Artikel haben wir uns angesehen, wie man in Python Bytes in Strings umwandelt.