Come convertire 'stringa binaria' in stringa normale in Python3?


257

Ad esempio, ho una stringa come questa (valore di ritorno di subprocess.check_output):

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

Qualunque cosa gli abbia fatto, viene sempre stampato con il fastidioso b'prima della stringa:

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

Qualcuno ha qualche idea su come usarlo come una normale stringa o convertirlo in una normale stringa?


Possibile duplicato di Converti byte in una stringa?
Georgy,

@HanfeiSun quello che chiami una " stringa binaria " è un oggetto byte (vedi informazioni sull'oggetto byte nella libreria standard )
loved.by.Jesus

Risposte:


357

Decodificalo.

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

Per ottenere byte dalla stringa, codificalo.

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

27
@lyomi, l'ho usato asciiperché la stringa data è stata creata con lettere ASCII. Non è necessario specificare la codifica se la codifica è utf-8(impostazione predefinita in Python 3.x secondo il str.encode, bytes.decodedoc-string)
falsetru

2
@lyomi Nel 2016 (ed è quasi alla fine) le persone usano ancora ascii. Esistono molti prodotti e sistemi "legacy" (comprese le specifiche), ma ci sono anche molti motivi per cui potresti creare una "stringa binaria" in cui non desideri unicode o qualcosa da provare e "unire" più byte in un singolo personaggio. Usiamo spesso 'stringhe' per contenere dati binari, ad esempio per fare richieste DNS ecc.
Jmons

Suggerisco di aggiungere quanto segue per completare la risposta. La maggior parte delle volte abbiamo bisogno di decodificare byte dal nostro sistema operativo, come l'output della console, il modo più pitone che ho trovato per farlo è quello di import localee poi os_encoding = locale.getpreferredencoding(). In questo modo, possiamo decodificare usandomy_b_string.decode(os_encoding)
aturegano il

2
@aturegano, non è l'unica opzione. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, l'uso di quel rilevamento automatico della codifica potrebbe risolvere il problema perché il sottoprogramma (OP utilizza un sottoprocesso) potrebbe essere scritto in altro modo per determinare la codifica (o addirittura hard-coded). Grazie per il feedback, comunque.
falsetru,

@falsetru Nota che sys.getfilesystemencoding()restituisce il nome della codifica utilizzata per la conversione tra nomi file Unicode e nomi file byte e dipende fortemente dal sistema operativo in uso. AFAIK, questa funzione viene utilizzata per convertire nella rappresentazione preferita del sistema. Ciò significa che non inferirà la codificazione utilizzata dalla console che può essere ottenuta utilizzando la locale.getpreferredencoding()funzione di cui sopra
aturegano,

71

Se la risposta di falsetru non ha funzionato, puoi anche provare:

>>> b'a string'.decode('utf-8')
'a string'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.