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

Es gibt zwei verschiedene Möglichkeiten, einen String in Bytes zu konvertieren, wie in den Antworten auf TypeError zu sehen: 'str' unterstützt die Pufferschnittstelle nicht

Welche dieser Methoden wäre besser oder mehr Pythonic? Oder ist es nur eine Frage der persönlichen Vorliebe?

b = bytes(mystring, 'utf-8') b = mystring.encode('utf-8') 

  • Schreiben einer Verbindungszeichenfolge, wenn das Passwort Sonderzeichen enthält
  • Konvertierung von utf-16 zu utf-8 in Python 3
  • Python, konvertiere 4-Byte-Zeichen, um MySQL-Fehler zu vermeiden "Falscher Zeichenfolgenwert:"
  • BeautifulSoup "encode (" utf-8 ")
  • 4 Solutions collect form web for “Beste Weg, um String zu Bytes in Python 3 zu konvertieren?”

    Wenn du die docs für bytes bytearray , zeigt sie dich auf bytearray :

    Bytearray ([source [, encoding [, errors]]])

    Gib ein neues Array von Bytes zurück. Der Bytearray-Typ ist eine veränderliche Folge von ganzen Zahlen im Bereich 0 <= x <256. Es hat die meisten üblichen Methoden von veränderlichen Sequenzen, die in Mutable Sequence-Typen beschrieben sind, sowie die meisten Methoden, die der Bytes-Typ hat, siehe Bytes und Byte Array Methoden.

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

    Wenn es ein String ist, müssen Sie auch die Codierung (und optional Fehler) Parameter geben; Bytearray () konvertiert dann die Zeichenfolge in Bytes mit str.encode ().

    Wenn es eine Ganzzahl ist, wird das Array diese Größe haben und wird mit Null-Bytes initialisiert.

    Wenn es sich um ein Objekt handelt, das der Pufferschnittstelle entspricht, wird ein Nur-Lese-Puffer des Objekts verwendet, um das Byte-Array zu initialisieren.

    Wenn es eine iterable ist, muss es eine Iteratur von ganzen Zahlen im Bereich 0 <= x <256 sein, die als Anfangsinhalt des Arrays verwendet werden.

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

    So können bytes viel mehr als nur einen String kodieren. Es ist Pythonic, dass es Ihnen erlauben würde, den Konstruktor mit jeder Art von Quellparameter aufzurufen, der Sinn macht.

    Für die Kodierung einer Zeichenfolge, denke ich, dass some_string.encode(encoding) ist mehr Pythonic als mit dem Konstruktor, weil es die meisten Selbst-Dokumentierung ist – "nehmen Sie diese Zeichenfolge und kodieren sie mit dieser Codierung" ist klarer als bytes(some_string, encoding) – es gibt kein explizites Verb, wenn du den Konstruktor benutzt.

    Bearbeiten: Ich habe die Python-Quelle überprüft. Wenn Sie eine Unicode-Zeichenfolge zu bytes mit CPython übergeben, ruft es PyUnicode_AsEncodedString auf , das ist die Implementierung von encode ; So dass du gerade einen Level der Indirektion überspringst, wenn du dich selbst kodierst.

    Siehe auch Serdalis 'Kommentar – unicode_string.encode(encoding) ist auch mehr Pythonic, weil seine Inverse ist byte_string.decode(encoding) und Symmetrie ist schön.

    Es ist einfacher als es gedacht ist:

     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 
     so_string = 'stackoverflow' so_bytes = so_string.encode( ) 

    Der absolut beste Weg ist weder der 2, sondern der 3.. Der erste Parameter, der encode Voreinstellungen auf 'utf-8' encode . So ist der beste Weg

     b = mystring.encode() 

    Dies wird auch schneller sein, da das Standardargument nicht in der Zeichenfolge "utf-8" im C-Code resultiert, sondern NULL , was viel schneller zu überprüfen ist!

    Hier sind einige Timings:

     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 war nur ~ 2 Prozent.

    Python ist die beste Programmiersprache der Welt.