Comment convertir une 'chaîne binaire' en chaîne normale en Python3?

257

Par exemple, j'ai une chaîne comme celle-ci (valeur de retour de subprocess.check_output):

>>> b'a string'
b'a string'

Quoi que je lui fasse, il est toujours imprimé avec l'ennuyeux b'avant la chaîne:

>>> print(b'a string')
b'a string'
>>> print(str(b'a string'))
b'a string'

Quelqu'un at-il des idées sur la façon de l'utiliser comme une chaîne normale ou de la convertir en une chaîne normale?

Hanfei Sun
la source
Duplicata possible de Convert bytes en chaîne?
Georgy
@HanfeiSun ce que vous appelez une " chaîne binaire " est un objet octets (voir les informations sur l' objet octets dans la bibliothèque standard )
loves.by.Jesus

Réponses:

357

Décode-le.

>>> b'a string'.decode('ascii')
'a string'

Pour obtenir des octets de la chaîne, codez-la.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
la source
27
@lyomi, j'ai utilisé asciiparce que la chaîne donnée a été faite avec des lettres ascii. Vous n'avez pas besoin de spécifier l'encodage si l'encodage est utf-8(par défaut dans Python 3.x selon str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi En 2016 (et c'est presque la fin), les gens utilisent encore ascii. Il existe de nombreux produits et systèmes `` hérités '' (y compris les spécifications), mais il existe également de nombreuses raisons pour lesquelles vous pouvez créer une `` chaîne binaire '' où vous ne voulez pas que l'unicode ou quelque chose essaie de `` fusionner '' plusieurs octets en un seul caractère. Nous utilisons souvent des «chaînes» pour contenir des données binaires, par exemple pour effectuer des requêtes DNS, etc.
Jmons
Je suggère d'ajouter ce qui suit pour compléter la réponse. La plupart du temps, nous devons décoder les octets de notre système d'exploitation, tels que la sortie de la console, la manière la plus pythonique que j'ai trouvée de le faire est de le faire import localeensuite os_encoding = locale.getpreferredencoding(). De cette façon, nous pouvons décoder en utilisantmy_b_string.decode(os_encoding)
aturegano
2
@aturegano, ce n'est pas la seule option. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. À mon humble avis, l'utilisation de ces détections automatiques de codage pourrait résoudre le problème car le sous-programme (OP utilise un sous-processus) pourrait être écrit d'une autre manière pour déterminer le codage (ou même codé en dur). Merci pour vos commentaires, de toute façon.
falsetru
@falsetru Notez que sys.getfilesystemencoding()renvoie le nom de l'encodage utilisé pour convertir entre les noms de fichiers Unicode et les noms de fichiers octets et dépend fortement du système d'exploitation que vous utilisez. AFAIK, cette fonction est utilisée pour convertir la représentation préférée du système. Cela signifie qu'il ne déduira pas la codification utilisée par la console qui peut être obtenue en utilisant la locale.getpreferredencoding()fonction susmentionnée
aturegano
71

Si la réponse de falsetru ne fonctionne pas, vous pouvez également essayer:

>>> b'a string'.decode('utf-8')
'a string'
kame
la source
0

Veuillez consulter le document officiel encode()et la decode()documentation de la codecsbibliothèque. utf-8est l'encodage par défaut pour les fonctions, mais il existe plusieurs encodages standard en Python 3, comme latin_1ou utf_32.

Daniel Argüelles
la source