Objet bytes

L’objet bytes est un n-uplet d’octets, non mutable, indicé, itérable. Chaque élément est un entier non signé compris entre 0 et 255.

 

https://docs.python.org/3/library/stdtypes.html#bytes-objects

 

Faisant l’interface avec les chaînes de caractères ascii, il est affiché sous forme de texte ascii par la fonction print. La confusion entre ce type et une chaîne de caractères est alors facile, mais l’objet est bien un n-uplet d’entiers compris entre 0 et 255.

 

Les objets ont une longueur, peuvent être concaténés (+), répétés (*) et il existe de nombreuses méthodes pratiques pour les manipuler : mise en majuscule, découpe, centrage… dont .strip() qui supprime les valeurs correspondant à des espaces, retour à la ligne, tabulation, en début et fin du n-uplet d’octets et retourne le résultat.

 

Définition littérale :

La définition littérale est proche d’une chaîne de caractères préfixée par b :

t = b'bonjour'

Mais les caractères doivent être ceux du code ASCII : symboles de l’anglais, pas d’accents.

t = b'été' provoque une erreur.

 

Les caractères spéciaux sont utilisables :

-          '\n' pour une fin de ligne ;

-          '\r' pour un retour à la ligne ;

-          '\t' pour une tabulation.

 

Les valeurs, en particulier pour les caractères non ASCCI peuvent être définis en hexadécimal :

t = b'\x46' correspond au caractère F car, 46 en hexadécimal correspond à 70 en décimal, code de F en ASCII.

 

Définition par conversion d’une chaîne de caractères

txt = "42 la réponse"

t = bytes(txt, 'utf8')

La fonction de conversion doit comprendre le codage utilisé pour la chaîne de caractères, l’UTF8 en python.

 

On remarque que l’accent ne pose pas de problème. En effet, en UTF8, les caractères sont codés par 1 à 3 octets successifs. La conversion utilise ces octets. Ainsi

bytes('ù', 'utf8')

donne les entiers 195 et 185, correspondant bien aux deux codes UTF8 du caractères ù.

 

Définition par conversion d’une liste ou n-uplet d’entiers

t = bytes((195, 185)) est équivalent à t=bytes('ù', 'utf8')

t = bytes((97, 98, 99)) est équivalent à t=b'abc'

 

Conversion en chaîne de caractères

t.decode() retourne une chaîne de caractère codée en UTF8 à partir du n-uplet d’octets. La chaîne de caractères peut contenir une fin de ligne ou une tabulation.

 

txt = 'séquence\tde\tdébut'

t = bytes(txt, 'utf8')

fin = t.decode()

Les chaînes de caractères txt et fin sont identiques.

 

Pour visualiser la différence entre n-uplet d’octets (bytes) et chaînes de caractères (str)

Le code suivant :

b = b'abc' # n-uplet d'octets

t = 'abc'  # chaîne de caractères

print(b)

print(t)

affiche

b'abc'

abc

 

mais chaque élément est un entier dans un cas, un caractère dans l’autre :

print(b[0])

print(t[0])

affiche

97

a

 

On retrouve ce comportement près conversion en listes :

print(list(b))

print(list(t))

affiche :

[97, 98, 99]

['a', 'b', 'c']

Itérer sur les éléments d’un n-uplet d’octets donne des entiers.