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.
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'
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)
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).