web-dev-qa-db-fra.com

Comment convertir une variable de chaîne d'octets Python 3 en chaîne normale?

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

bytes_string=part.get_payload(decode=False)

La charge utile se présente sous la forme d'une chaîne d'octets, comme le suggère mon nom de variable.

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

L'exemple montre:

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

Comment puis-je appliquer l'argument du mot clé b (octets) à ma variable bytes_string et utiliser l'approche recommandée?

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

str(bbytes_string, 'utf-8')
83
DjangoTango

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

str(bytes_string, 'utf-8')

parce que le type de bytes_string est bytes, identique au type de b'abc'.

159
Toby Speight

Appelez decode() sur une instance bytes pour obtenir le texte qu'elle code.

str = bytes.decode()
44
uname01

MISE À JOUR:

NE PAS AVOIR DE b et des guillemets au début et à la fin

Comme votre code peut avoir méconnaissable caractères pour le codage 'utf-8', il est préférable d'utiliser simplement str sans aucun paramètre supplémentaire:

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

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

Comme PYTHON 3 standard dit, text serait dans utf-8 maintenant sans souci.

6
Seyfi

Comment filtrer (ignorer) les charachers non-UTF8 du tableau?

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

Code

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

Détails

A partir de docs , voici d'autres exemples utilisant le même paramètre errors:

>>> 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 conformément aux règles de codage. Les valeurs légales pour cet argument sont 'strict' (soulève une exception UnicodeDecodeError), 'replace' (utilise U+FFFD, REPLACEMENT CHARACTER) ou 'ignore' (juste laissez le caractère en dehors du résultat Unicode).

4
pylang