Converter bytes em uma corda

I'm usando este código para obter a saída padrão de um programa externo:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

O método comunicar() retorna um conjunto de bytes:

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Entretanto, I'gostaria de trabalhar com a saída como uma string Python normal. Para que eu pudesse imprimi-la desta forma:

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

Eu pensei que'é para isso que serve o método binascii.b2a_qp(), mas quando eu tentei, eu consegui o mesmo byte array novamente:

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Como posso converter o valor dos bytes de volta para string? Quero dizer, usando o "baterias" em vez de o fazer manualmente. E I'gostaria que estivesse OK com Python 3.

Solução

Você precisa decodificar o objeto bytes para produzir uma cadeia:

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'
Comentários (18)

Você precisa decodificar a cadeia de bytes e transformá-la em uma cadeia de caracteres (Unicode).

Em Python 2

encoding = 'utf-8'
'hello'.decode(encoding)

ou

unicode('hello', encoding)

Em Python 3

encoding = 'utf-8'
b'hello'.decode(encoding)

ou

str(b'hello', encoding)
Comentários (0)

Acho que queres mesmo isto:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

A resposta de Aaron's estava correta, exceto que você precisa saber que codificação* usar. E acredito que o Windows usa 'windows-1252'. Só importará se você tiver alguns caracteres incomuns (não-ASCII) em seu conteúdo, mas então fará diferença.

A propósito, o fato de que ele faz diferença é a razão pela qual Python passou a usar dois tipos diferentes para dados binários e de texto: ele pode'não converter magicamente entre eles, porque ele não'não sabe a codificação a menos que você diga! A única maneira de VOCÊ saber é ler a documentação do Windows (ou lê-la aqui).

Comentários (2)