it-swarm.com.de

Beste Weg, um Zeichenfolge in Bytes in Python 3 zu konvertieren?

Es scheint zwei verschiedene Möglichkeiten zu geben, einen String in Bytes zu konvertieren, wie in den Antworten auf TypeError zu sehen: 'str' unterstützt die Buffer-Schnittstelle 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')
659
Mark Ransom

Wenn Sie in den Dokumenten nach bytes suchen, werden Sie auf bytearray hingewiesen:

bytearray ([Quelle [ Kodierung [ Fehler]]])

Gibt ein neues Array von Bytes zurück. Der Bytearray-Typ ist eine veränderbare Folge von ganzen Zahlen im Bereich 0 <= x <256. Er verfügt über die meisten der in Mutable Sequence Types beschriebenen üblichen Methoden für veränderbare Folgen sowie über die meisten Methoden des Bytetyps, siehe Bytes und Byte-Array-Methoden.

Der optionale Quellparameter kann verwendet werden, um das Array auf verschiedene Arten zu initialisieren:

Wenn es sich um eine Zeichenfolge handelt, müssen Sie auch die Codierungsparameter (und optional die Fehlerparameter) angeben. bytearray () konvertiert dann den String mit str.encode () in Bytes.

Wenn es sich um eine Ganzzahl handelt, hat das Array diese Größe und wird mit null Bytes initialisiert.

Wenn es sich um ein Objekt handelt, das der Pufferschnittstelle entspricht, wird ein Nur-Lese-Puffer des Objekts zum Initialisieren des Bytes-Arrays verwendet.

Wenn es sich um eine Iteration handelt, muss es sich um eine Iteration von Ganzzahlen im Bereich 0 <= x <256 handeln, die als Anfangsinhalt des Arrays verwendet werden.

Ohne Argument wird ein Array der Größe 0 erstellt.

bytes kann also viel mehr als nur eine Zeichenfolge codieren. Es ist Pythonic, dass Sie den Konstruktor mit jeder Art von Quellparameter aufrufen können, die Sinn macht.

Für die Codierung eines Strings halte ich some_string.encode(encoding) für pythonischer als die Verwendung des Konstruktors, da dies am selbstdokumentierendsten ist - "Nehmen Sie diesen String und codieren Sie ihn mit dieser Codierung" ist klarer als bytes(some_string, encoding) - - Wenn Sie den Konstruktor verwenden, gibt es kein explizites Verb.

Bearbeiten: Ich habe die Quelle Python überprüft. Wenn Sie mit CPython eine Unicode-Zeichenfolge an bytes übergeben, wird PyUnicode_AsEncodedString aufgerufen. Dies ist die Implementierung von encode; Sie überspringen also nur eine Indirektionsebene, wenn Sie selbst encode aufrufen.

Siehe auch Serdalis 'Kommentar - unicode_string.encode(encoding) ist auch pythonischer, da sein Inverses byte_string.decode(encoding) und Symmetrie Nice ist.

483
agf

Es ist einfacher als gedacht:

my_str = "hello world"
my_str_as_bytes = str.encode(my_str)
type(my_str_as_bytes) # ensure it is byte representation
my_decoded_str = my_str_as_bytes.decode()
type(my_decoded_str) # ensure it is string representation
244
hasanatkazmi

Der absolut beste Weg ist keiner der beiden, sondern der dritte. Der erste Parameter von encode ist standardmäßig 'utf-8' seit Python 3.0. Also der beste Weg ist

b = mystring.encode()

Dies ist auch schneller, da das Standardargument nicht die Zeichenfolge "utf-8" im C-Code ergibt, sondern NULL, also viel schneller zu überprüfen!

Hier einige Zeitangaben:

In [1]: %timeit -r 10 'abc'.encode('utf-8')
The slowest run took 38.07 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 183 ns per loop

In [2]: %timeit -r 10 'abc'.encode()
The slowest run took 27.34 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 137 ns per loop

Trotz der Warnung waren die Zeiten nach wiederholten Läufen sehr stabil - die Abweichung betrug nur ~ 2 Prozent.


Die Verwendung von encode() ohne Argument ist nicht Python 2-kompatibel, da in Python 2 die Standardzeichencodierung ASCII.

>>> 'äöä'.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
95
Antti Haapala

Sie können Zeichenfolgen einfach in Bytes konvertieren, indem Sie Folgendes verwenden:

a_string.encode()

und Sie können einfach Bytes in Zeichenfolgen konvertieren, indem Sie Folgendes verwenden:

some_bytes.decode()

bytes.decode und str.encode haben encoding='utf-8' als Standardwert.

Die folgenden Funktionen (entnommen aus Effective Python ) können nützlich sein, um str in bytes und bytes in str zu konvertieren:

def to_bytes(bytes_or_str):
    if isinstance(bytes_or_str, str):
        value = bytes_or_str.encode() # uses 'utf-8' for encoding
    else:
        value = bytes_or_str
    return value # Instance of bytes


def to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes):
        value = bytes_or_str.decode() # uses 'utf-8' for encoding
    else:
        value = bytes_or_str
    return value # Instance of str
40
lmiguelvargasf
so_string = 'stackoverflow'
so_bytes = so_string.encode( )
9
gerardw