Was macht der 'b' Charakter vor einem String-Literal?

Anscheinend ist die folgende gültige Syntax …

my_string = b'The string' 

Ich würde gerne wissen…

  1. Was bedeutet dieses b Zeichen vor der Zeichenfolge?
  2. Was sind die Auswirkungen der Verwendung?
  3. Was sind geeignete Situationen, um es zu benutzen.

Ich habe eine verwandte Frage hier auf SO gefunden, aber diese Frage ist über PHP aber und es sagt, dass die b wird, um anzuzeigen, dass die Zeichenfolge binär ist, im Gegensatz zu Unicode, die für Code benötigt wurde, um von der Version von PHP <6 kompatibel zu sein, wenn Sie zu migrieren PHP 6. Ich glaube nicht, das gilt für Python.

Ich habe diese Dokumentation auf der Python-Site gefunden, um ein u Zeichen in der gleichen Syntax zu verwenden, um einen String als Unicode anzugeben. Unglücklicherweise nennt man den b- Charakter nicht überall in diesem Dokument.

Auch, nur aus Neugier, gibt es mehr Symbole als die b und u , die andere Dinge tun?

  • Python - Problem mit akzentuierten Zeichen beim Abkratzen von Daten von der Website
  • Eine widerstandsfähige, tatsächlich funktionierende CSV-Implementierung für Nicht-Ascii?
  • Python: Konvertieren Sie RTF-Datei in Unicode?
  • UnicodeEncodeError beim Umleiten von stdout [duplicate]
  • HTML-Scraping mit lxml und Anfragen gibt einen Unicode-Fehler
  • "Unicode-Fehler" Unicodeescape "Codec kann keine Bytes decodieren ... Textdateien können in Python 3 nicht geöffnet werden
  • Python, um in UTF8 auf Windows XP mit der Konsole zu drucken
  • Beitreten devanagari Wörter falsch aus pdfminer extrahiert
  • 5 Solutions collect form web for “Was macht der 'b' Charakter vor einem String-Literal?”

    Um die Python 2.x Dokumentation zu zitieren:

    Ein Präfix von 'b' oder 'B' wird in Python 2 ignoriert; Es zeigt an, dass das Literal ein Bytes-Literal in Python 3 werden sollte (zB wenn Code automatisch mit 2to3 umgewandelt wird). Ein 'u' oder 'b' Präfix kann von einem 'r' Präfix folgen.

    Die Python 3.3-Dokumentation lautet:

    Bytes-Literale werden immer mit 'b' oder 'B' vorangestellt; Sie erzeugen eine Instanz des Bytes-Typs anstelle des Str-Typs. Sie dürfen nur ASCII-Zeichen enthalten; Bytes mit einem numerischen Wert von 128 oder größer müssen mit Escapes ausgedrückt werden.

    Python 3.x unterscheidet zwischen den Typen:

    • str = '...' literals = eine Folge von Unicode-Zeichen (UTF-16 oder UTF-32, je nachdem, wie Python kompiliert wurde)
    • bytes = b'...' literals = eine Folge von Oktetten (ganze Zahlen zwischen 0 und 255)

    Wenn Sie mit Java oder C # vertraut sind, denken Sie an str als String und bytes als byte[] . Wenn Sie mit SQL vertraut sind, denken Sie an str als NVARCHAR und bytes wie BINARY oder BLOB . Wenn Sie mit der Windows Registry vertraut sind, denken Sie an str als REG_SZ und bytes als REG_BINARY . Wenn Sie mit C (++) vertraut sind, dann vergessen Sie alles, was Sie über char und Strings gelernt haben, denn A CHARACTER IST NICHT BYTE . Diese Idee ist längst veraltet.

    Sie verwenden str wenn Sie Text darstellen möchten.

     print('שלום עולם') 

    Sie verwenden bytes wenn Sie niedrige Binärdaten wie Strukturen darstellen möchten.

     NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0] 

    Sie können ein str zu einem bytes Objekt verschlüsseln .

     >>> '\uFEFF'.encode('UTF-8') b'\xef\xbb\xbf' 

    Und du kannst ein bytes in einen str . Dekodieren.

     >>> b'\xE2\x82\xAC'.decode('UTF-8') '€' 

    Aber man kann die beiden Typen nicht frei mischen.

     >>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't concat bytes to str 

    Die b'...' Notation ist etwas verwirrend, dass es erlaubt, die Bytes 0x01-0x7F mit ASCII-Zeichen anstelle von Hex-Zahlen angegeben werden.

     >>> b'A' == b'\x41' True 

    Aber ich muss betonen, ein Charakter ist kein Byte .

     >>> 'A' == b'A' False 

    In Python 2.x

    Pre-3.0 Versionen von Python fehlte diese Art von Unterscheidung zwischen Text und Binärdaten. Stattdessen gab es:

    • unicode = u'...' literals = Reihenfolge der Unicode-Zeichen = 3.x str
    • str = '...' literals = Sequenzen von verstopften Bytes / Zeichen
      • In der Regel Text, in einer nicht näher bezeichneten Codierung codiert.
      • Aber auch verwendet, um binäre Daten wie struct.pack Ausgabe struct.pack .

    Um den 2.x-to-3.x-Übergang zu erleichtern, wurde die b'...' Literal-Syntax in Python 2.6 zurückgesetzt, um die Unterscheidung von binären Strings (die bytes in 3.x sein sollten) aus Text zu ermöglichen Strings (die in 3.x liegen sollten). Das b Präfix tut nichts in 2.x, sondern sagt dem 2to3 Skript, es nicht in eine Unicode-Zeichenfolge in 3.x zu konvertieren.

    Also ja, b'...' Literale in Python haben den gleichen Zweck, den sie in PHP machen.

    Auch, nur aus Neugier, gibt es mehr Symbole als die b und u, die andere Dinge tun?

    Das r Präfix erzeugt einen Rohstring (zB r'\t' ist ein Backslash + t anstelle eines Tabs) und Triple zitiert '''...''' oder """...""" erlauben Multi -line String Literale.

    Das B bezeichnet einen Byte-String.

    Bytes sind die tatsächlichen Daten. Strings sind eine Abstraktion.

    Wenn du ein Multi-Zeichen-String-Objekt hast und du ein einziges Zeichen genommen hast, wäre es ein String, und es könnte mehr als 1 Byte groß sein, je nach Codierung.

    Wenn du 1 Byte mit einer Byte-Saite benötigte, bekommst du einen einzigen 8-Bit-Wert von 0-255 und es könnte kein komplettes Zeichen darstellen, wenn diese Zeichen aufgrund der Codierung> 1 Byte waren.

    TBH würde ich Strings verwenden, es sei denn, ich hatte einige spezifische niedrige Grund, um Bytes zu verwenden.

    Es verwandelt es in ein bytes Literal (oder str in 2.x) und gilt für 2.6+.

    Das r Präfix führt dazu, dass Backslashs "uninterpretiert" werden (nicht ignoriert, und der Unterschied ist wichtig).

    Hier ist ein Beispiel, bei dem die Abwesenheit von 'b' eine TypeError-Ausnahme in Python 3.x auslösen würde

     >>> f=open("new", "wb") >>> f.write("Hello Python!") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' does not support the buffer interface 

    Das Hinzufügen eines 'b' Präfix würde das Problem beheben.

    Python ist die beste Programmiersprache der Welt.