¿Cómo convertir 'cadena binaria' a cadena normal en Python3?

257

Por ejemplo, tengo una cadena como esta (valor de retorno de subprocess.check_output):

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

Lo que sea que le hice, siempre se imprime con el molesto b'antes de la cadena:

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

¿Alguien tiene alguna idea sobre cómo usarlo como una cadena normal o convertirlo en una cadena normal?

Hanfei Sun
fuente
¿Posible duplicado de Convertir bytes a una cadena?
Georgy
@HanfeiSun lo que llama una " cadena binaria " es un objeto de bytes (consulte la información sobre el objeto de bytes en la biblioteca estándar )
loved.by.Jesus

Respuestas:

357

Descifrarlo.

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

Para obtener bytes de la cadena, codifíquelo.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
fuente
27
@lyomi, solía asciiporque la cadena dada estaba hecha con letras ascii. No necesita especificar la codificación si la codificación es utf-8(predeterminada en Python 3.x según str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi En 2016 (y es casi el final) la gente todavía usa ascii. Hay muchos productos y sistemas 'heredados' (incluidas las especificaciones), pero también hay muchas razones por las que podría estar creando una 'cadena binaria' donde no desea unicode o algo para intentar y 'fusionar' múltiples bytes en Un solo personaje. A menudo usamos 'cuerdas' para contener los datos binarios para la toma de peticiones DNS instancia etc.
Jmons
Sugiero agregar lo siguiente para completar la respuesta. La mayoría de las veces necesitamos decodificar bytes de nuestro sistema operativo, como la salida de la consola, la forma más pitónica que encontré para hacerlo es import localey luego os_encoding = locale.getpreferredencoding(). De esta manera, podemos decodificar usandomy_b_string.decode(os_encoding)
aturegano
2
@aturegano, no es la única opción. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. En mi humilde opinión, el uso de la detección automática de codificación podría resolver el problema porque el subprograma (OP está utilizando el subproceso) podría escribirse de otra manera para determinar la codificación (o incluso codificado). Gracias por sus comentarios, de todos modos.
falsetru
@falsetru Tenga en cuenta que sys.getfilesystemencoding()devuelve el nombre de la codificación utilizada para convertir entre nombres de archivo Unicode y nombres de archivo de bytes y depende en gran medida del sistema operativo que esté utilizando. AFAIK, esta función se utiliza para convertir a la representación preferida del sistema. Eso significa que no inferirá la codificación utilizada por la consola que se puede obtener utilizando la locale.getpreferredencoding()función mencionada anteriormente
aturegano
71

Si la respuesta de falsetru no funcionó, también puedes probar:

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

Por favor, consulte oficial encode()y decode()documentación de la codecsbiblioteca. utf-8es la codificación predeterminada para las funciones, pero hay varias codificaciones estándar en Python 3, como latin_1o utf_32.

Daniel Argüelles
fuente