Was bedeutet ein Präfix vor einer Python-Zeichenfolge?

107

In einem Python-Quellcode, auf den ich gestoßen bin, habe ich ein kleines b vor einem String wie in gesehen:

b"abcdef"

Ich kenne das uPräfix, das eine Unicode-Zeichenfolge kennzeichnet, und das rPräfix für ein Raw-Zeichenfolgenliteral.

Wofür steht das bund in welcher Art von Quellcode ist es nützlich, da es genau wie eine einfache Zeichenfolge ohne Präfix zu sein scheint?

kriss
quelle
10
@SLott: Folgen Sie dem Link, den Sie angegeben haben. Sie werden sehen, dass das Präfix b im Zeichenfolgenpräfix ... für 2.6 nicht zulässig ist (sieht aus wie ein kleiner Fehler im Referenzmaterial). Und über solche Dinge zu googeln ist nicht einfach. Ich habe Schlüsselwörter wie "b Python String Prefix" ausprobiert und bin im Grunde nirgendwo hingekommen.
Kriss
Dem verwendeten Link S.Lott fehlt ein Versionsspezifizierer. Hier geht es um Python 3: docs.python.org/3/reference/… . Das Präfix wird jetzt auch in Python 2.6 und höher unterstützt , um den versionierungsübergreifenden Python-Code zu vereinfachen.
Martijn Pieters
1
Diese Frage ist weder "ein genaues Duplikat" noch eine Antwort auf die Frage "Kann ich dieses 'b'-Zeichen in meiner Druckanweisung entfernen?" stackoverflow.com/questions/42599851/… würde es Ihnen etwas ausmachen, das zu markieren, bitte Marihuana? Die Person, die gefragt hat, sowie die Person, die tatsächlich eine Antwort versucht hat, könnte es zu schätzen wissen, eine Antwort auf die tatsächlich gestellte Frage haben zu können.
me_

Antworten:

62

Dies ist das Python3- bytes Literal . Dieses Präfix fehlt in Python 2.5 und älter (es entspricht einer einfachen Zeichenfolge von 2.x, während eine einfache Zeichenfolge von 3.x einem Literal mit einem uPräfix in 2.x entspricht). In Python 2.6+ entspricht es aus Gründen der Kompatibilität mit 3.x einer einfachen Zeichenfolge .

wRAR
quelle
@ WRAR: War in Python 2.6 Code, den ich gesehen habe, scheint es wurde in Python2.6 eingeführt
kriss
Ich habe es speziell in der Referenz 2.6 überprüft, bevor ich es gepostet habe
wRAR
1
OK, "Aus Gründen der zukünftigen Kompatibilität fügt Python 2.6 Bytes als Synonym für den str-Typ hinzu und unterstützt auch die b '' - Notation." Aus "Was ist neu?".
wRAR
Da
kriss
98

Das bPräfix kennzeichnet ein bytesZeichenfolgenliteral .

Wenn Sie sehen, dass es im Python 3-Quellcode verwendet wird, erstellt der Ausdruck ein bytesObjekt , kein reguläres Unicode- strObjekt . Wenn Sie sehen, dass es in Ihrer Python-Shell oder als Teil einer Liste, eines Diktats oder eines anderen Containerinhalts wiedergegeben wird, sehen Sie ein bytesObjekt, das mit dieser Notation dargestellt wird.

bytesObjekte enthalten grundsätzlich eine Folge von Ganzzahlen im Bereich von 0 bis 255, aber wenn sie dargestellt werden, zeigt Python diese Bytes als ASCII-Codepunkte an, um das Lesen ihres Inhalts zu erleichtern. Jegliche Bytes außerhalb des druckbaren Bereichs von ASCII - Zeichen sind als Escape - Sequenzen gezeigt (zB \n, \x82usw.). Umgekehrt können Sie sowohl ASCII-Zeichen als auch Escape-Sequenzen verwenden, um Bytewerte zu definieren. für ASCII-Werte wird deren numerischer Wert verwendet (zB b'A'== b'\x41')

Da ein bytesObjekt aus einer Folge von Ganzzahlen besteht, können Sie ein bytesObjekt aus einer beliebigen anderen Folge von Ganzzahlen mit Werten im Bereich von 0 bis 255 erstellen, z. B. eine Liste:

bytes([72, 101, 108, 108, 111])

und Indizierung gibt Ihnen die ganzen Zahlen zurück (aber Slicing erzeugt einen neuen bytesWert, für das obige Beispiel, value[0]gibt Ihnen 72aber value[:1]ist b'H'als 72 der ASCII - Code Punkt für den Großbuchstaben ist H ).

bytesmodellieren Binärdaten , einschließlich codierter Text . Wenn Ihr bytesWert Text enthält, müssen Sie ihn zuerst mit dem richtigen Codec dekodieren. Wenn die Daten beispielsweise als UTF-8 codiert sind, können Sie einen Unicode- strWert erhalten mit:

strvalue = bytesvalue.decode('utf-8')

Um umgekehrt von Text in einem strObjekt zu einem zu byteswechseln, müssen Sie codieren . Sie müssen sich für eine zu verwendende Codierung entscheiden. Standardmäßig wird UTF-8 verwendet. Was Sie jedoch benötigen, hängt stark von Ihrem Anwendungsfall ab:

bytesvalue = strvalue.encode('utf-8')

Sie können auch den Konstruktor verwenden, bytes(strvalue, encoding)um dasselbe zu tun.

Sowohl die Dekodierungs- als auch die Kodierungsmethode benötigen ein zusätzliches Argument, um anzugeben, wie Fehler behandelt werden sollen .

Python 2, Versionen 2.6 und 2.7, unterstützt auch das Erstellen von String-Literalen mithilfe der b'..'String-Literal-Syntax, um Code zu vereinfachen, der sowohl in Python 2 als auch in Python 3 funktioniert.

bytesObjekte sind unveränderlich, genau wie strStrings. Verwenden Sie ein bytearray()Objekt, wenn Sie einen veränderlichen Bytewert benötigen.

Martijn Pieters
quelle