Comment convertir une variable de chaîne d'octets Python 3 en une chaîne régulière?

116

J'ai lu dans une pièce jointe XML avec

bytes_string=part.get_payload(decode=False)

La charge utile est fournie sous forme de chaîne d'octets, comme le suggère mon nom de variable.

J'essaie d'utiliser l'approche Python 3 recommandée pour transformer cette chaîne en une chaîne utilisable que je peux manipuler.

L'exemple montre:

str(b'abc','utf-8')

Comment puis-je appliquer l' bargument de mot clé (octets) à ma variable bytes_stringet utiliser l'approche recommandée?

La façon dont j'ai essayé ne fonctionne pas:

str(bbytes_string, 'utf-8')
DjangoTango
la source

Réponses:

210

Vous aviez presque raison dans la dernière ligne. Tu veux

str(bytes_string, 'utf-8')

car le type de bytes_stringest bytes, le même que le type de b'abc'.

Toby Speight
la source
6
str(bytes_string, 'utf-8', 'ignore')Les erreurs peuvent être ignorées en passant le troisième paramètre.
Shubhamoy
2
Cela semble être un commentaire à la réponse de pylang (qui traite de la gestion des entrées invalides). Si (vous croyez que) il n'y a rien de mal bytes_string, pourquoi voudriez-vous ignorer les erreurs?
Toby Speight
3
Je reçois l'erreur suivante avec votre approche: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 0: invalid start bytepour la chaîne d'octets suivante b'\xbf\x8cd\xba\x7f\xe0\xf0\xb8t\xfe.TaFJ\xad\x100\x07p\xa0\x1f90\xb7P\x8eP\x90\x06)0'@TobySpeight
alper
Eh bien @alper, ce n'est pas une chaîne UTF-8 valide, alors à quoi vous attendiez-vous?
Toby Speight
Merci pour la solution
Ajay Kumar
49

Appelez decode()une bytesinstance pour obtenir le texte qu'elle encode.

str = bytes.decode()
uname01
la source
5
UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0xf6 en position 230: octet de départ invalide
Juha Untinen
3
@JuhaUntinen votre encodage n'est probablement pas utf-8.
tommy.carstensen
4
Comment filtrer (sauter) les caractères non UTF8 du tableau?
Dr Failov
9

ACTUALISÉ:

NE PAS EN AVOIR bet citations au début et à la fin

Comment convertir bytestel quel en chaînes, même dans des situations étranges.

Comme votre code peut avoir des caractères non reconnaissables à 'utf-8'encoder, il est préférable d'utiliser uniquement str sans paramètres supplémentaires:

some_bad_bytes = b'\x02-\xdfI#)'
text = str( some_bad_bytes )[2:-1]

print(text)
Output: \x02-\xdfI

si vous ajoutez un 'utf-8'paramètre, à ces octets spécifiques, vous devriez recevoir une erreur.

Comme le dit la norme PYTHON 3, textserait maintenant dans utf-8 sans souci.

Seyfi
la source
le résultat est "b '\\ x02 - \\ xdfI #)'" ce qui n'est probablement pas ce qu'il veut
Glen Thompson
@GlenThompson c'est juste un exemple de conditions indésirables, qui peuvent arriver. J'utilise ce texte spécifique intentionnellement. Si vous voulez dire que le texte a un ben premier, alors j'ai mis à jour la réponse
Seyfi
donc très merci, je cherche un moyen de supprimer le b '' d'une chaîne qui a le caractère ansi sans encoder et perdre les caractères, je suis nouveau en python et je ne sais pas que je peux réduire un tableau depuis le début et commençant à utiliser les index: O
Diego Fernando Murillo Valenci
@DiegoFernandoMurilloValenci, votre bienvenue. Heureux de pouvoir vous aider.
Seyfi
6

Comment filtrer (sauter) les caractères non UTF8 du tableau?

Pour adresser ce commentaire dans le post de @ uname01 et l'OP, ignorez les erreurs:

Code

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

Détails

À partir de la documentation , voici d'autres exemples utilisant le même errorsparamètre:

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

L'argument errors spécifie la réponse lorsque la chaîne d'entrée ne peut pas être convertie selon les règles de codage. Les valeurs légales de cet argument sont 'strict'(lever une UnicodeDecodeErrorexception),'replace' autorisées (utiliser U+FFFD, REPLACEMENT CHARACTER) ou 'ignore'(simplement laisser le caractère hors du résultat Unicode).

pylang
la source