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?


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'

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'

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.