Wie aus den Antworten auf TypeError hervorgeht, gibt es zwei verschiedene Möglichkeiten, eine Zeichenfolge in Bytes zu konvertieren: 'str' unterstützt die Pufferschnittstelle nicht
Welche dieser Methoden wäre besser oder pythonischer? Oder ist es nur eine Frage der persönlichen Präferenz?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
python
string
character-encoding
python-3.x
Mark Ransom
quelle
quelle
bytes(item, "utf8")
, da explizit besser als implizit ist, also ...str.encode( )
standardmäßig lautlos Bytes verwendet werden, wodurch Sie mehr Unicode-Zen, aber weniger explizites Zen erhalten. Auch "common" ist kein Begriff, dem ich gerne folge. Auchbytes(item, "utf8")
ist eher wie diestr()
undb"string"
Notationen. Ich entschuldige mich, wenn ich nicht in der Lage bin, Ihre Gründe zu verstehen. Vielen Dank.encode()
sie nicht anruftbytes()
, sondern umgekehrt. Das ist natürlich nicht sofort klar, weshalb ich die Frage gestellt habe.Antworten:
Wenn man sich die Dokumente sucht
bytes
, es verweist Sie aufbytearray
:So
bytes
kann viel mehr als nur einen String kodieren. Es ist pythonisch, dass Sie den Konstruktor mit jedem sinnvollen Quellparameter aufrufen können.Für die Codierung einer Zeichenfolge denke ich, dass dies
some_string.encode(encoding)
pythonischer ist als die Verwendung des Konstruktors, da es am selbstdokumentierendsten ist - "Nehmen Sie diese Zeichenfolge und codieren Sie sie mit dieser Codierung" ist klarer alsbytes(some_string, encoding)
- es gibt kein explizites Verb, wenn Sie das verwenden Konstrukteur.Bearbeiten: Ich habe die Python-Quelle überprüft. Wenn Sie eine Unicode-Zeichenfolge an
bytes
CPython übergeben, wird PyUnicode_AsEncodedString aufgerufen. Dies ist die Implementierung vonencode
; Sie überspringen also nur eine Indirektionsebene, wenn Sie sichencode
selbst anrufen .Siehe auch Serdalis 'Kommentar -
unicode_string.encode(encoding)
ist auch pythonischer, weil seine Umkehrungbyte_string.decode(encoding)
und Symmetrie schön ist.quelle
unicode_string.encode(encoding)
paßt gut ,bytearray.decode(encoding)
wenn Sie Ihren String zurück wollen.bytearray
wird verwendet, wenn Sie ein veränderbares Objekt benötigen. Sie brauchen es nicht für einfachestr
↔bytes
Konvertierungen.bytearray
außer dass die Dokumente fürbytes
keine Details angeben, sie sagen nur "dies ist eine unveränderliche Version vonbytearray
", also muss ich von dort aus zitieren.bytes
: Vermeiden Sie den Bytes Typ als Funktion mit einem ganzzahligen Argumente. In Version 2 wird die in eine (Byte-) Zeichenfolge konvertierte Ganzzahl zurückgegeben, da Bytes ein Alias für str ist, während in Version 3 ein Bytestring zurückgegeben wird, der die angegebene Anzahl von Nullzeichen enthält. Verwenden Sie beispielsweise anstelle der v3-Ausdrucksbytes (6) das entsprechende b '\ x00' * 6, das in jeder Version nahtlos auf die gleiche Weise funktioniert.byte_string.decode('latin-1')
alsutf-8
nicht den gesamten Bereich 0x00 bis 0xFF (0-255) decken, die Python - Check - out - Dokumente für Mehr Info.Es ist einfacher als gedacht:
quelle
obj.method()
Syntax anstelle voncls.method(obj)
Syntax, dh verwenden Siebytestring = unicode_text.encode(encoding)
undunicode_text = bytestring.decode(encoding)
.self
als erstes Argumentencode
als gebundene Methode für die Zeichenfolge. Diese Antwort schlägt vor, dass Sie stattdessen die ungebundene Methode aufrufen und die Zeichenfolge übergeben sollten. Das ist die einzige neue Information in der Antwort, und sie ist falsch.Der absolut beste Weg ist keiner der 2, sondern der 3 .. Der erste Standardparameter seit Python 3.0. Somit ist der beste Weg
encode
'utf-8'
Dies wird auch schneller, da das Standard - Argument nicht im String führt
"utf-8"
im C - Code, aberNULL
, das ist viel schneller zu überprüfen!Hier einige Timings:
Trotz der Warnung waren die Zeiten nach wiederholten Läufen sehr stabil - die Abweichung betrug nur ~ 2 Prozent.
Die Verwendung
encode()
ohne Argument ist nicht Python 2-kompatibel, da in Python 2 die Standardzeichenkodierung ASCII ist .quelle
'\u00012345'*10000
. Beide nehmen 28.8us auf meinem Laptop; Die zusätzlichen 50 ns gehen vermutlich im Rundungsfehler verloren. Natürlich ist dies ein ziemlich extremes Beispiel - aber es'abc'
ist genauso extrem in die entgegengesetzte Richtung.