Comment convertir des octets en chaîne de caractères en Python 2 et Python 3
- Convertir des octets en chaîne de caractères en Python 2.x
- Convertir des octets en chaîne de caractères en Python 3.x
- Comparaison des performances et conclusion des différentes méthodes de conversion d’octets en chaîne
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.
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 FacebookArticle connexe - Python Bytes
- Comment convertir des octets en entiers en Python 2.7 et 3.x
- Comment convertir des Int en octets en Python 2 et Python 3
- Comment convertir l'Int en binaire en Python
- Comment convertir une chaîne de caractères en octets en Python
- B devant la chaîne en Python
Article connexe - Python String
- Supprimer les virgules de la chaîne en Python
- Comment vérifier qu'une chaîne est vide de manière pythonique
- Convertir une chaîne en nom de variable en Python
- Comment supprimer les espaces dans une chaîne de caractères en Python
- Comment extraire des nombres d'une chaîne de caractèresen Python
- Comment convertir une chaîne de caractères en datetime en Python