Estou usando esse código para obter saída padrão de um programa externo:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
O método communic () retorna uma matriz 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'
No entanto, eu gostaria de trabalhar com a saída como uma string Python normal. Para que eu pudesse imprimi-lo assim:
>>> 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 tentei, obtive a mesma matriz de bytes 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 faço para converter o valor de bytes novamente em string? Quero dizer, usando as "baterias" em vez de fazê-lo manualmente. E eu gostaria que tudo estivesse bem com o Python 3.
str(text_bytes)
não é possível especificar a codificação. Dependendo do conteúdo de text_bytes, text_bytes.decode('cp1250
) `pode resultar em uma string muito diferente de text_bytes.decode('utf-8')
.
str
função não se converte mais em uma string real. É preciso dizer uma codificação explicitamente, por algum motivo, que tenho preguiça de ler o porquê. Basta convertê-lo utf-8
e ver se seu código funciona. por exemplo,var = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
funciona como esperado no Python 3. Embora unicode_text = bytestring.decode(character_encoding)
seja mais preferível evitar confusão, apenas str(bytes_obj)
isso produz uma representação de texto para, em bytes_obj
vez de decodificá-la para texto: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
estr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
funciona? Isso me parece bizarro.