84 votes

Comment convertir les octets et les chaînes de caractères en Python 3 ?

Il s'agit d'une question de type Python 101, mais elle m'a laissé perplexe pendant un certain temps lorsque j'ai essayé d'utiliser un paquet qui semblait convertir ma chaîne de caractères en octets.

Comme vous le verrez ci-dessous, j'ai trouvé la réponse moi-même, mais j'ai estimé que cela valait la peine d'être consigné ici en raison du temps qu'il m'a fallu pour découvrir ce qui se passait. Il semble que ce soit générique à Python 3, donc je n'ai pas fait référence au paquetage original avec lequel je jouais ; il ne semble pas s'agir d'une erreur (juste que le paquetage particulier avait un .tostring() méthode qui a été clairement no produisant ce que j'ai compris comme une chaîne...)

Mon programme de test se déroule comme suit :

import mangler                                 # spoof package

stringThing = """
<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting></Greeting>
</Doc>
"""

# print out the input
print('This is the string input:')
print(stringThing)

# now make the string into bytes
bytesThing = mangler.tostring(stringThing)    # pseudo-code again

# now print it out
print('\nThis is the bytes output:')
print(bytesThing)

Le résultat de ce code est le suivant :

This is the string input:

<Doc>
    <Greeting>Hello World</Greeting>
    <Greeting></Greeting>
</Doc>

This is the bytes output:
b'\n<Doc>\n    <Greeting>Hello World</Greeting>\n    <Greeting>\xe4\xbd\xa0\xe5\xa5\xbd</Greeting>\n</Doc>\n'

Il est donc nécessaire de pouvoir convertir les octets et les chaînes de caractères, afin d'éviter que des caractères non ASCII ne soient transformés en charabia.

119voto

Bobble Points 666

Le "mangler" dans l'exemple de code ci-dessus faisait l'équivalent de cela :

bytesThing = stringThing.encode(encoding='UTF-8')

Il existe d'autres façons d'écrire cela (notamment en utilisant bytes(stringThing, encoding='UTF-8') mais la syntaxe ci-dessus permet de comprendre ce qui se passe et ce qu'il faut faire pour récupérer la chaîne :

newStringThing = bytesThing.decode(encoding='UTF-8')

Ce faisant, la chaîne de caractères originale est retrouvée.

Remarque : l'utilisation de str(bytesThing) transcrit simplement tout le charabia sans le reconvertir en Unicode, à moins que vous ne demandiez spécifiquement UTF-8, c'est-à-dire, str(bytesThing, encoding='UTF-8') . Aucune erreur n'est signalée si le codage n'est pas spécifié.

18voto

NuclearPeon Points 547

En python3, il existe une fonction bytes() qui a le même format que la méthode encode() .

str1 = b'hello world'
str2 = bytes("hello world", encoding="UTF-8")
print(str1 == str2) # Returns True

Je n'ai rien lu à ce sujet dans la documentation, mais peut-être n'ai-je pas cherché au bon endroit. De cette façon, vous pouvez explicitement transformer des chaînes en flux d'octets et les rendre plus lisibles qu'en utilisant encode y decode et sans avoir à choisir entre les deux. b devant les guillemets.

5voto

plugwash Points 795

Il s'agit d'une question de type Python 101,

C'est une question simple, mais la réponse n'est pas si simple.


En python3, un objet "bytes" représente une séquence d'octets, un objet "string" représente une séquence de points de code unicode.

Pour convertir des "octets" en "chaînes" et des "chaînes" en "octets", vous utilisez les fonctions bytes.decode et string.encode. Ces fonctions prennent deux paramètres, un encodage et une politique de gestion des erreurs.

Malheureusement, il existe un très grand nombre de cas où des séquences d'octets sont utilisées pour représenter du texte, sans que le codage utilisé soit nécessairement bien défini. Prenons l'exemple des noms de fichiers sur les systèmes de type Unix : pour le noyau, il s'agit d'une séquence d'octets avec une poignée de valeurs spéciales. Sur la plupart des plates-formes modernes, la plupart des noms de fichiers sont codés en UTF-8, mais rien ne garantit que tous les noms de fichiers le seront.

Si vous voulez écrire un logiciel robuste, vous devez réfléchir attentivement à ces paramètres. Vous devez réfléchir soigneusement à l'encodage dans lequel les octets sont supposés être et à la manière dont vous allez gérer le cas où ils s'avèrent ne pas être une séquence valide d'octets pour l'encodage dans lequel vous pensiez qu'ils devaient être. Python utilise par défaut UTF-8 et se trompe sur toute séquence d'octets qui n'est pas UTF-8 valide.

print(bytesThing)

Python utilise "repr" comme solution de rechange pour la conversion en chaîne de caractères. repr tente de produire du code Python qui recréera l'objet. Dans le cas d'un objet de type bytes, cela signifie, entre autres, l'échappement des bytes en dehors de la plage ascii imprimable.

3voto

Tamjid Ahmed Points 47

ESSAYEZ CECI :

StringVariable=ByteVariable.decode('UTF-8','ignore')

TYPE DE TEST :

print(type(StringVariable))

Ici, "StringVariable" est représenté par une chaîne de caractères. 'ByteVariable' représente un octet. La question des variables n'est pas pertinente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X