Anscheinend ist das Folgende die gültige Syntax:
my_string = b'The string'
Ich würde gerne wissen:
- Was bedeutet dieses
b
Zeichen vor der Zeichenfolge? - Welche Auswirkungen hat die Verwendung?
- Was sind geeignete Situationen, um es zu verwenden?
Ich habe hier auf SO eine verwandte Frage gefunden, aber diese Frage bezieht sich auf PHP und besagt b
, dass die Zeichenfolge binär ist, im Gegensatz zu Unicode, das benötigt wurde, damit Code mit der Version von PHP <6 kompatibel ist Ich glaube nicht, dass dies für Python gilt, wenn Sie auf PHP 6 migrieren.
Ich habe diese Dokumentation auf der Python-Site über die Verwendung eines u
Zeichens in derselben Syntax gefunden, um eine Zeichenfolge als Unicode anzugeben. Leider wird das b- Zeichen nirgendwo in diesem Dokument erwähnt.
Gibt es aus Neugier mehr Symbole als die b
und u
die andere Dinge tun?
unicode_literals
aus__future__
, wird diese „reverse“ das Verhalten für diese bestimmte Zeichenfolge (in Python 2.x)Python 3.x unterscheidet klar zwischen den Typen:
str
='...'
Literale = eine Folge von Unicode-Zeichen (UTF-16 oder UTF-32, je nachdem, wie Python kompiliert wurde)bytes
=b'...'
Literale = eine Folge von Oktetten (ganze Zahlen zwischen 0 und 255)Wenn Sie mit Java oder C # vertraut sind, denken Sie an
str
asString
undbytes
asbyte[]
. Wenn Sie mit SQL vertraut sind, denken Sie anstr
asNVARCHAR
undbytes
asBINARY
oderBLOB
. Wenn Sie mit der Windows-Registrierung vertraut sind, denken Sie anstr
asREG_SZ
undbytes
asREG_BINARY
. Wenn Sie mit C (++) vertraut sind, vergessen Sie alles, was Sie gelernt haben,char
und Zeichenfolgen, da ein Zeichen kein Byte ist . Diese Idee ist längst überholt.Sie verwenden,
str
wenn Sie Text darstellen möchten.Sie werden verwendet,
bytes
wenn Sie binäre Daten auf niedriger Ebene wie Strukturen darstellen möchten.Sie können a in ein Objekt codieren .
str
bytes
Und Sie können a
bytes
in a dekodierenstr
.Sie können die beiden Typen jedoch nicht frei mischen.
Die
b'...'
Notation ist insofern etwas verwirrend, als die Bytes 0x01-0x7F mit ASCII-Zeichen anstelle von Hex-Zahlen angegeben werden können.Aber ich muss betonen, ein Zeichen ist kein Byte .
In Python 2.x.
In Versionen vor 3.0 von Python fehlte diese Unterscheidung zwischen Text und Binärdaten. Stattdessen gab es:
unicode
=u'...'
Literale = Folge von Unicode-Zeichen = 3.x.str
str
='...'
Literale = Folgen von verwirrten Bytes / Zeichenstruct.pack
Ausgabe verwendet.Um den Übergang von 2.x zu 3.x zu vereinfachen, wurde die
b'...'
Literal-Syntax auf Python 2.6 zurückportiert, um die Unterscheidung von Binärzeichenfolgen (diebytes
in 3.x sein sollten) von Textzeichenfolgen (diestr
in 3 sein sollten) zu ermöglichen .x). Dasb
Präfix führt in 2.x nichts aus, weist das2to3
Skript jedoch an, es in 3.x nicht in eine Unicode-Zeichenfolge zu konvertieren.Also ja,
b'...'
Literale in Python haben den gleichen Zweck wie in PHP.Das
r
Präfix erstellt eine unformatierte Zeichenfolge (z. B.r'\t'
ein Backslash +t
anstelle einer Registerkarte) und dreifache Anführungszeichen'''...'''
oder"""..."""
lässt mehrzeilige Zeichenfolgenliterale zu.quelle
'A' == b'A' --> False
Scheck macht es wirklich klar. Der Rest ist ausgezeichnet, aber bis zu diesem Punkt hatte ich nicht richtig verstanden, dass eine Byte-Zeichenfolge nicht wirklich Text ist.'שלום עולם' == 'hello world'
Das b bezeichnet eine Bytezeichenfolge.
Bytes sind die tatsächlichen Daten. Strings sind eine Abstraktion.
Wenn Sie ein mehrstelliges Zeichenfolgenobjekt hätten und ein einzelnes Zeichen verwenden würden, wäre dies eine Zeichenfolge, die je nach Codierung mehr als 1 Byte groß sein könnte.
Wenn Sie 1 Byte mit einer Byte-Zeichenfolge belegen, erhalten Sie einen einzelnen 8-Bit-Wert von 0 bis 255, der möglicherweise kein vollständiges Zeichen darstellt, wenn diese Zeichen aufgrund der Codierung> 1 Byte sind.
TBH Ich würde Zeichenfolgen verwenden, es sei denn, ich hätte einen bestimmten Grund für die Verwendung von Bytes auf niedriger Ebene.
quelle
Wenn wir auf der Serverseite eine Antwort senden, wird diese in Form eines Bytetyps gesendet, sodass sie im Client als angezeigt wird
b'Response from server'
Um loszuwerden, verwenden Sie
b'....'
einfach den folgenden Code:Serverdatei:
Client-Datei:
dann wird es gedruckt
Response from server
quelle
Hier ist ein Beispiel, bei dem das Fehlen von
b
eineTypeError
Ausnahme in Python 3.x auslösen würdeDas Hinzufügen eines
b
Präfixes würde das Problem beheben.quelle
Es verwandelt es in ein
bytes
Literal (oderstr
in 2.x) und gilt für 2.6+.Das
r
Präfix bewirkt, dass Backslashes "nicht interpretiert" werden (nicht ignoriert, und der Unterschied spielt eine Rolle).quelle
str
in beiden Fällen ein in 2.x sein, also könnte man sagen, dass es ignoriert wird. Die Unterscheidung ist wichtig, wenn Sieunicode_literals
aus dem__future__
Modul importieren .Beachten Sie zusätzlich zu den Aussagen anderer, dass ein einzelnes Zeichen in Unicode aus mehreren Bytes bestehen kann .
Die Funktionsweise von Unicode besteht darin, dass das alte ASCII-Format (7-Bit-Code, der wie 0xxx xxxx aussieht) verwendet und Mehrbyte -Sequenzen hinzugefügt wurden , bei denen alle Bytes mit 1 (1xxx xxxx) beginnen, um Zeichen jenseits von ASCII darzustellen, sodass Unicode rückwärts ist -kompatibel mit ASCII.
quelle
Sie können JSON verwenden, um es in ein Wörterbuch zu konvertieren
{"Schlüsselwert"}
FLASCHE:
Dies ist ein Beispiel aus der Flasche. Führen Sie dies auf der Terminalleitung aus:
In flask / route.py
{'Schlüsselwert'}
quelle