Como converter 'string binária' em string normal no Python3?

257

Por exemplo, eu tenho uma string como esta (valor de retorno de subprocess.check_output):

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

O que quer que eu tenha feito, é sempre impresso com o irritante b'antes da string:

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

Alguém tem alguma idéia sobre como usá-lo como uma string normal ou convertê-lo em uma string normal?

Hanfei Sun
fonte
Possível duplicata de Converter bytes em uma string?
Georgy
@HanfeiSun O que você chama de " string binária " é um objeto de bytes (consulte as informações sobre o objeto de bytes na biblioteca padrão )
loved.by.Jesus

Respostas:

357

Decodifique.

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

Para obter bytes da string, codifique-a.

>>> 'a string'.encode('ascii')
b'a string'
falsetru
fonte
27
@lyomi, eu usei asciiporque a string fornecida foi feita com letras ascii. Você não precisa especificar codificação se a codificação é utf-8(padrão em Python 3.x segundo str.encode, bytes.decodedoc-string)
falsetru
2
@lyomi Em 2016 (e quase no fim), as pessoas ainda usam ascii. Existem muitos produtos e sistemas 'legados' (incluindo especificações), mas também existem muitas razões pelas quais você pode estar criando uma 'sequência binária' na qual não deseja unicode ou algo para tentar 'mesclar' vários bytes em um único personagem.
Costumamos
Sugiro adicionar o seguinte para completar a resposta. Na maioria das vezes, precisamos decodificar bytes do nosso sistema operacional, como a saída do console, a maneira mais pitônica que encontrei para fazê-lo é import localee então os_encoding = locale.getpreferredencoding(). Dessa forma, podemos decodificar usandomy_b_string.decode(os_encoding)
aturegano
2
@ aturegano, não é a única opção. sys.getfilesystemencoding(), sys.stdin.encoding, sys.stdout.encoding. IMHO, o uso da detecção automática de codificação pode resolver o problema porque o subprograma (o OP está usando o subprocesso) pode ser escrito de outra maneira para determinar a codificação (ou mesmo o código fixo). Obrigado pelo feedback, de qualquer maneira.
falsetru
@falsetru Observe que sys.getfilesystemencoding()retorna o nome da codificação usada para converter entre nomes de arquivos Unicode e bytes e é fortemente dependente do sistema operacional que você está usando. AFAIK, esta função é usada para converter na representação preferida do sistema. Isso significa que ele não vai inferir a codificação utilizada pelo console que pode ser obtida usando o já mencionado locale.getpreferredencoding()função
aturegano
71

Se a resposta da falsetru não funcionou, você também pode tentar:

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

Por favor, consulte o oficial encode()e a decode()documentação da codecsbiblioteca. utf-8é a codificação padrão para as funções, mas há várias codificações padrão no Python 3, como latin_1ou utf_32.

Daniel Argüelles
fonte