1037 votes

Que fait le caractère 'b' devant un littéral de chaîne de caractères ?

Apparemment, la syntaxe suivante est valable :

b'The string'

Je voudrais savoir :

  1. Qu'est-ce que cela b devant la chaîne de caractères ?
  2. Quels sont les effets de son utilisation ?
  3. Quelles sont les situations appropriées pour l'utiliser ?

J'ai trouvé un Question connexe ici même sur SO, mais cette question concerne le PHP, et il est dit que les b est utilisé pour indiquer que la chaîne est binaire, par opposition à Unicode, ce qui était nécessaire pour que le code soit compatible avec une version de PHP < 6, lors de la migration vers PHP 6. Je ne pense pas que cela s'applique à Python.

J'ai trouvé cette documentation sur le site Python à propos de l'utilisation d'un u dans la même syntaxe pour spécifier une chaîne en tant qu'Unicode. Malheureusement, il ne mentionne pas le b n'importe où dans ce document.

Par ailleurs, juste par curiosité, existe-t-il d'autres symboles que le symbole de l'eau ? b y u qui font d'autres choses ?

1 votes

Pour la partie curiosité, depuis python 3.6 il y a les f-strings qui sont vraiment utiles. Vous pouvez faire : v = "world" print(f "Hello {v}") obtenir "Hello world". Un autre exemple est f"{2 * 5}" qui vous donne "10". C'est la voie à suivre pour travailler avec des chaînes de caractères.

871voto

dan04 Points 33306

Python 3.x fait une distinction claire entre les types :

Si vous êtes familier avec :

  • Java ou C#, pensez à str como String y bytes como byte[] ;
  • SQL, pensez à str como NVARCHAR y bytes como BINARY o BLOB ;
  • Le registre de Windows, pensez à str como REG_SZ y bytes como REG_BINARY .

Si vous êtes familier avec le C(++), alors oubliez tout ce que vous avez appris sur le char et des chaînes de caractères, car un caractère n'est pas un octet . Cette idée est depuis longtemps obsolète.

Vous utilisez str lorsque vous voulez représenter du texte.

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

Vous utilisez bytes lorsque vous voulez représenter des données binaires de bas niveau comme les structs.

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

Vous pouvez encoder a str à un bytes objet.

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

Et vous pouvez décoder un bytes en un str .

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

Mais vous ne pouvez pas mélanger librement les deux types.

>>> 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

En b'...' est quelque peu déroutante dans la mesure où elle permet de spécifier les octets 0x01-0x7F avec des caractères ASCII au lieu de chiffres hexadécimaux.

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

Mais je dois insister, un caractère n'est pas un octet .

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

En Python 2.x

Les versions antérieures à la version 3.0 de Python ne faisaient pas ce genre de distinction entre les données textuelles et binaires. À la place, il y avait :

  • unicode = u'...' littéraux = séquence de caractères Unicode = 3.x str
  • str = '...' littéraux = séquences d'octets/caractères confondus
    • Généralement du texte, codé dans un codage non spécifié.
    • Mais aussi utilisé pour représenter des données binaires comme struct.pack sortie.

Afin de faciliter la transition de 2.x à 3.x, l'initiative b'...' a été rétroportée dans Python 2.6, afin de permettre la distinction entre les chaînes binaires (qui doivent être bytes en 3.x) à partir de chaînes de texte (qui devraient être str en 3.x). Le site b ne fait rien dans la version 2.x, mais indique à la fonction 2to3 script pour ne pas le convertir en chaîne Unicode dans 3.x.

Alors oui, b'...' Les littéraux en Python ont le même but qu'en PHP.

Aussi, juste par curiosité, y a-t-il d'autres symboles que le b et le u qui font d'autres choses ?

En r Le préfixe crée une chaîne brute (par exemple, r'\t' est un backslash + t au lieu d'une tabulation), et des guillemets triples '''...''' o """...""" autoriser les chaînes littérales multi-lignes.

5 votes

Merci. J'ai compris après avoir lu ces phrases : "Afin de faciliter la transition de 2.x à 3.x, la syntaxe littérale b'...' a été rétroportée dans Python 2.6, afin de permettre de distinguer les chaînes binaires (qui devraient être des octets en 3.x) des chaînes de texte (qui devraient être des str en 3.x). Le préfixe b ne fait rien en 2.x, mais indique au 2to3 script de ne pas le convertir en chaîne Unicode en 3.x."

8 votes

En 'A' == b'A' --> False vérifier vraiment est clair. Le reste est excellent, mais jusqu'à présent, je n'avais pas bien compris qu'une chaîne d'octets, c'est pas vraiment de texte.

15 votes

' ' == 'hello world'

514voto

NPE Points 169956

Je cite la documentation Python 2.x :

Le préfixe "b" ou "B" n'est pas pris en compte dans le calcul de l'impôt sur le revenu. Python 2 ; il indique que le doit devenir un littéral d'octet en Python 3 (par exemple, lorsque le code est automatiquement converti avec 2to3). A u " ou " b " peut être suivi d'un préfixe d'un préfixe "r".

En Documentation Python 3 États :

Les littéraux bytes sont toujours préfixés par 'b' ou 'B' ; ils produisent une instance du type bytes au lieu du type str. Ils ne peuvent contenir que des caractères ASCII ; les octets dont la valeur numérique est égale ou supérieure à 128 doivent être exprimés avec des échappatoires.

7 votes

Il semble donc que Python < v3 ignorera simplement ce caractère supplémentaire. Quel serait le cas dans la v3 où vous auriez besoin d'utiliser une chaîne de caractères b par opposition à une simple chaîne de caractères ordinaire ?

7 votes

@Gweebz - si vous tapez réellement une chaîne de caractères dans un encodage particulier au lieu d'utiliser des échappatoires unicode (par exemple b'). \xff\xfe\xe12 au lieu de \u32e1 ').

1 votes

C'est logique. Je vais marquer celle-ci comme étant la réponse acceptée mais il y a d'autres bonnes réponses ici aussi !

33voto

gecko Points 254

Le b désigne une chaîne d'octets.

Les octets sont les données réelles. Les chaînes de caractères sont une abstraction.

Si vous avez un objet chaîne de caractères multiples et que vous prenez un seul caractère, il s'agit d'une chaîne de caractères, dont la taille peut être supérieure à un octet selon l'encodage.

Si vous prenez 1 octet avec une chaîne d'octets, vous obtiendrez une seule valeur de 8 bits de 0 à 255 et il se peut qu'elle ne représente pas un caractère complet si ces caractères, en raison de l'encodage, sont > 1 octet.

Pour ma part, j'utiliserais des chaînes de caractères à moins d'avoir une raison spécifique de bas niveau pour utiliser des octets.

14voto

user3053230 Points 41

Voici un exemple où l'absence de b lancerait un TypeError exception dans Python 3.x

>>> 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

Ajout d'un b préfixe réglerait le problème.

11voto

Il le transforme en un bytes littéral (ou str en 2.x), et est valable pour 2.6+.

En r fait en sorte que les barres obliques inversées ne sont pas interprétées (elles ne sont pas ignorées, et la différence entre les deux est la suivante fait matière).

0 votes

Cela semble erroné selon la documentation citée dans la réponse de aix ; le b sera ignoré dans les versions de Python autres que la 3.

2 votes

Il s'agira d'un str dans la version 2.x, on peut donc dire qu'elle est ignorée. La distinction est importante lorsque vous importez unicode_literals de la __future__ module.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X