web-dev-qa-db-fra.com

Que signifie un préfixe b avant une chaîne python?

Dans un python code source sur lequel je suis tombé, j'ai vu un petit b devant une chaîne comme dans:

b"abcdef"

Je connais le préfixe u signifiant une chaîne unicode et le préfixe r pour un littéral de chaîne brut.

Que signifie b et dans quel type de code source est-il utile car il semble être exactement comme une chaîne simple sans aucun préfixe?

94
kriss

Il s'agit de Python3 byteslittéral . Ce préfixe est absent dans Python 2.5 et plus ancien (il équivaut à une chaîne ordinaire de 2.x, tandis que la chaîne ordinaire de 3.x équivaut à un littéral avec u préfixe dans 2.x). Dans Python 2.6+, il est équivalent à une chaîne simple, pour la compatibilité avec 3.x .

60
wRAR

Le préfixe b signifie un bytes littéral de chaîne .

Si vous le voyez utilisé dans Python 3 code source, l'expression crée un bytes objet , pas un régulier nicode str object . Si vous le voyez en écho dans votre Python ou dans le cadre d'une liste, d'un dict ou d'un autre contenu de conteneur, alors vous voyez un objet bytes représenté en utilisant cette notation.

bytes les objets contiennent essentiellement une séquence d'entiers compris entre 0 et 255, mais lorsqu'ils sont représentés, Python affiche ces octets sous la forme ASCII points de code pour facilitent la lecture de leur contenu. Tous les octets en dehors de la plage imprimable de ASCII sont affichés sous forme de séquences d'échappement ( par exemple \n, \x82, etc.). Inversement, vous pouvez utiliser les deux ASCII et séquences d'échappement pour définir les valeurs d'octets; pour ASCII valeurs leur valeur numérique est utilisée (par exemple b'A' == b'\x41')

Étant donné qu'un objet bytes est constitué d'une séquence d'entiers, vous pouvez construire un objet bytes à partir de toute autre séquence d'entiers avec des valeurs dans la plage 0-255, comme une liste:

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

et l'indexation vous restitue les entiers (mais le découpage produit une nouvelle valeur bytes; pour l'exemple ci-dessus, value[1] vous donne 101, mais value[:1] est b'H' Car 72 est le point de code ASCII pour la lettre majuscule [~ # ~] h [~ # ~] ).

bytes modèle données binaires , y compris texte codé . Si votre valeur bytes contient du texte, vous devez d'abord le décoder, en utilisant le bon codec. Si les données sont encodées en UTF-8, par exemple, vous pouvez obtenir une valeur Unicode str avec:

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

Inversement, pour passer du texte d'un objet str à bytes, vous devez coder . Vous devez décider d'un encodage à utiliser; la valeur par défaut est d'utiliser UTF-8, mais ce dont vous aurez besoin dépend fortement de votre cas d'utilisation:

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

Vous pouvez également utiliser le constructeur, bytes(strvalue, encoding) pour faire de même.

Les méthodes de décodage et de codage prennent un argument supplémentaire pour spécifier comment les erreurs doivent être traitées .

Python 2, versions 2.6 et 2.7 prennent également en charge la création de littéraux de chaîne à l'aide de la syntaxe de littéral de chaîne b'..', Pour faciliter le code qui fonctionne sur les deux Python 2 et 3.

bytes les objets sont immuables, tout comme les chaînes str. Utilisez un objet bytearray() si vous devez avoir une valeur d'octets modifiables.

80
Martijn Pieters