Comment convertir des octets en chaîne de caractères en Python 2 et Python 3

Jinku Hu 10 octobre 2023
  1. Convertir des octets en chaîne de caractères en Python 2.x
  2. Convertir des octets en chaîne de caractères en Python 3.x
  3. Comparaison des performances et conclusion des différentes méthodes de conversion d’octets en chaîne
Comment convertir des octets en chaîne de caractères en Python 2 et Python 3

Cet article du tutoriel présentera comment convertir des bytes en chaîne de caractères en Python 2.x et Python 3.x.

Convertir des octets en chaîne de caractères en Python 2.x

Les octets en Python 2.7 sont identiques à la str, donc la variable initialisée comme bytes est la chaîne de caractères intrinsèquement.

python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
'cd'
>>> type(A)
<type 'str'>

Convertir des octets en chaîne de caractères en Python 3.x

Les bytes sont un nouveau type de données introduit en Python 3.

python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> A = b'cd'
>>> A
b'cd'
>>> type(A)
<class 'bytes'>
>>> 

Le type de données des éléments dans les bytes est int.

>>> A = b'cd'
>>> A[0]
99
>>> type(A[0])
<class 'int'>

Convertir des octets en chaîne de caractères en utilisant le decode en Python 3.x

La méthode .decode des bytes pourrait convertir des octets en chaîne de caractères avec la méthode encoding donnée. Il est possible dans la plupart des cas de laisser la méthode encoding par défaut utf-8, mais ce n’est pas toujours sûr car les octets pourraient être encodés avec une autre méthode d’encodage plutôt qu’avec utf-8.

>>> b'\x50\x51'.decode()
'PQ'
>>> b'\x50\x51'.decode('utf-8')
'PQ'
>>> b'\x50\x51'.decode(encoding = 'utf-8')
'PQ'

Les trois façons de décoder les bytes comme montré ci-dessus sont identiques car utf-8 est utilisé comme méthode d’encodage.

Il peut y avoir des erreurs quand utf-8 est utilisé mais que les octets ne sont pas encodés avec cette méthode.

>>> b'\x50\x51\xffed'.decode('utf-8')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    b'\x50\x51\xffed'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid start byte

Nous obtenons l’erreur UnicodeDecodeError qui dit que utf-8 n’est pas le bon codec.

Nous avons deux approches pour résoudre ce problème d’encoding.

Le remplacement par un backslash, le remplacement par unignore ou le remplacement par des paramètres d’erreurs

decode a l’autre paramètre à part encoding - errors. Il définit le comportement quand une errors se produit. La valeur par défaut de errors est strict, ce qui signifie qu’une erreur se produit si l’erreur se produit lors du processus de décodage.

error a d’autres options comme ignore, replace ou d’autres noms codecs.register_error enregistrés, backslashreplace par exemple.

ignore ignore les mauvaises erreurs de décodage et crée la chaîne de sortie comme il peut.

replace remplace les caractères correspondants par les caractères définis dans la méthode encoding comme donné.backslashreplace remplace les caractères qui ne pouvaient pas être décodés avec le même contenu que dans les bytes originaux.

>>> b'\x50\x51\xffed'.decode('utf-8', 'backslashreplace')
'PQ\\xffed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'ignore')
'PQed'
>>> b'\x50\x51\xffed'.decode('utf-8', 'replace')
'PQ�ed'

L’encodage MS-DOS cp437 peut être utilisé si l’encodage des données des bytes est inconnu.

>>> b'\x50\x51\xffed'.decode('cp437')
'PQ\xa0ed'

chr pour convertir les octets en chaîne de caractères en Python 3.x

chr(i, /) retourne une chaîne Unicode d’un caractère avec un ordinal. Il pourrait convertir l’élément d’bytes en une string mais pas les bytes complets.

Nous pourrions utiliser la compréhension de liste ou map pour obtenir la chaîne convertie d’ bytes tout en employant chr pour l’élément individuel.

>>> A =  b'\x50\x51\x52\x53'
>>> "".join([chr(_) for _ in A])
'PQRS'
>>> "".join(map(chr, A))
'PQRS'

Comparaison des performances et conclusion des différentes méthodes de conversion d’octets en chaîne

Nous utilisons timeit pour comparer les performances des méthodes présentées dans ce tutoriel - decode et chr.

>>> import timeit
>>> timeit.timeit('b"\x50\x51\x52\x53".decode()', number=1000000)
0.1356779
>>> timeit.timeit('"".join(map(chr, b"\x50\x51\x52\x53"))', number=1000000)
0.8295201999999975
>>> timeit.timeit('"".join([chr(_) for _ in b"\x50\x51\x52\x53"])', number=1000000)
0.9530071000000362

Vous pouvez voir à partir de la performance temporelle montrée ci-dessus, decode() est beaucoup plus rapide et chr() est relativement inefficace parce qu’il doit reconstruire la chaîne de caractères à partir d’un seul caractère.

Nous recommandons l’utilisation de decode dans les applications à performances critiques.

Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - Python Bytes

Article connexe - Python String