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')
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'
.
Appelez decode()
sur une instance bytes
pour obtenir le texte qu'elle code.
str = bytes.decode()
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.
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 exceptionUnicodeDecodeError
),'replace'
(utiliseU+FFFD
,REPLACEMENT CHARACTER
) ou'ignore'
(juste laissez le caractère en dehors du résultat Unicode).