Introduction
Dans cet article, nous allons voir comment convertir des octets en chaîne en Python. À la fin de cet article, vous aurez une idée claire de ce que sont ces types et comment manipuler efficacement des données en les utilisant.
Selon la version de Python que vous utilisez, cette tâche sera différente. Bien que Python 2 ait atteint sa fin de vie, de nombreux projets l’utilisent encore, nous inclurons donc à la fois les approches de Python 2 et de Python 3.
Convertir des octets en chaîne dans Python 3
Depuis Python 3, l’ancienne façon ASCII de faire les choses a dû disparaître, et Python est devenu complètement Unicode.
Cela signifie que nous avons perdu le type unicode explicite : u"string"
– chaque chaîne de caractères est une u"string"
!
Pour différencier ces chaînes de caractères des bons vieux bytestrings, on nous présente un nouveau spécificateur pour elles – le b"string"
.
Ce dernier a été ajouté dans Python 2.6, mais cela n’a servi à rien d’autre qu’à préparer Python 3, car toutes les chaînes de caractères étaient des bytestrings en 2.6.
Les bytestrings dans Python 3 sont officiellement appelés bytes
, une séquence immuable d’entiers dans l’intervalle 0 <= x < 256. Un autre objet de type bytes
ajouté en 2.6 est le bytearray
– similaire à bytes
, mais mutable.
Convertir des octets en chaîne de caractères avec decode()
Voyons comment nous pouvons convertir des octets en chaîne de caractères, en utilisant la méthode intégrée decode()
de la classe bytes
:
Passant le format d’encodage, nous avons décodé l’objet bytes
en une chaîne de caractères et l’avons imprimé.
Convertir des octets en chaîne de caractères avec les codecs
Alternativement, nous pouvons utiliser le module intégré codecs
à cette fin également :
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
Vous n’avez pas vraiment besoin de passer le paramètre d’encodage, bien qu’il soit conseillé de le faire :
>>> codecs.decode(b)"Let's grab a 🍕!"
Convertir des octets en chaîne avec str()
Enfin, vous pouvez utiliser la fonction str()
, qui accepte diverses valeurs et les convertit en chaînes de caractères :
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
Veillez cependant à fournir l’argument encodage à str()
, sinon vous risquez d’obtenir des résultats inattendus :
>>> str(b)b'Lets grab a \xf0\x9f\x8d\x95!'
Ce qui nous amène encore une fois aux encodages. Si vous spécifiez le mauvais encodage, le meilleur cas est que votre programme se plante parce qu’il ne peut pas décoder les données. Par exemple, si nous essayions d’utiliser la fonction str()
avec UTF-16
, nous serions accueillis par :
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
Cela est d’autant plus important que Python 3 aime assumer l’Unicode – donc si vous travaillez avec des fichiers ou des sources de données qui utilisent un encodage obscur, assurez-vous de faire très attention.
Convertir des octets en chaîne de caractères en Python 2
En Python 2, un paquet d’octets et une chaîne de caractères sont pratiquement la même chose – les chaînes de caractères sont des objets composés de caractères d’un octet, ce qui signifie que chaque caractère peut stocker 256 valeurs. C’est pourquoi elles sont parfois appelées bytestrings.
C’est génial quand on travaille avec des données d’octets – il suffit de les charger dans une variable et nous sommes prêts à imprimer :
>>> s = "Hello world!">>> s'Hello world!'>>> len(s)12
L’utilisation de caractères Unicode dans les bytestrings modifie cependant un peu ce comportement :
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
Convertir les octets en Unicode (Python 2)
Ici, nous devrons utiliser le type Unicode
de Python 2, qui est supposé et automatiquement utilisé dans Python 3. Celui-ci stocke les chaînes de caractères comme une série de points de code, plutôt que des octets.
La \xf0\x9f\x8d\x95
représente les octets comme des nombres hexadécimaux à deux chiffres, car Python ne sait pas comment les représenter en tant que caractères ASCII :
>>> u = u"Let's grab a 🍕!"u"Let's grab a \U0001f355!"">>> u"Let's grab a 🍕!"# Yum.>>> len(u)15
Comme vous pouvez le voir ci-dessus, la chaîne Unicode contient \U0001f355
– un caractère échappé Unicode que notre terminal sait maintenant imprimer comme une part de pizza ! Définir cela était aussi simple que d’utiliser le spécificateur u
avant la valeur du bytestring.
Alors, comment passer de l’un à l’autre ?
Vous pouvez obtenir la chaîne Unicode en décodant votre bytestring. Cela peut être fait en construisant un objet Unicode, en fournissant le bytestring et une chaîne contenant le nom de l’encodage comme arguments ou en appelant .decode(encoding)
sur un bytestring.
Convertir des octets en chaîne de caractères à l’aide de decode() (Python 2)
Vous pouvez également utiliser la codecs.encode(s, encoding)
du module codecs
.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Convertir des octets en chaîne de caractères en utilisant des codecs (Python 2)
Ou, en utilisant le module codecs
:
import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
Soyez attentif à votre encodage
Un mot de prudence ici – les octets peuvent être interprétés différemment dans différents encodages. Avec environ 80 encodages différents disponibles en sortie de boîte, il peut ne pas être facile de savoir si vous avez le bon !
Le message original était soit øç
, soit јч
, et les deux semblent être des conversions valides.
Conclusion
En tant que programmeurs, il y a certaines choses auxquelles nous devons constamment penser et nous préparer activement afin d’éviter les pièges. Cela est particulièrement vrai aux niveaux inférieurs, où nous allons rarement lorsque nous utilisons un langage de haut niveau comme Python comme notre conducteur quotidien.
Des choses comme les charsets, les encodages et le binaire sont là pour nous rappeler que notre travail consiste à coder – à encoder nos pensées en solutions fonctionnelles. Heureusement, une grande partie de cette réflexion devient une partie de notre routine après quelques tours au clavier.
Dans cet article, nous avons passé en revue comment convertir des octets en chaînes de caractères en Python.