Estoy usando este código para obtener una salida estándar de un programa externo:
>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
El método de comunicación () devuelve una 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'
Sin embargo, me gustaría trabajar con la salida como una cadena Python normal. Para poder imprimirlo así:
>>> 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
Pensé que para eso era el método binascii.b2a_qp () , pero cuando lo probé, obtuve el mismo conjunto de bytes nuevamente:
>>> 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'
¿Cómo convierto el valor de bytes de nuevo a cadena? Quiero decir, usar las "baterías" en lugar de hacerlo manualmente. Y me gustaría que estuviera bien con Python 3.
str(text_bytes)
no se puede especificar la codificación. Dependiendo de lo que hay en text_bytes, text_bytes.decode('cp1250
) `podría resultar en una cadena muy diferente a text_bytes.decode('utf-8')
.
str
función ya no se convierte en una cadena real. Uno tiene que decir una codificación explícitamente por alguna razón, soy demasiado flojo para leer por qué. Simplemente conviértalo utf-8
y vea si su código funciona. por ejemplovar = var.decode('utf-8')
unicode_text = str(bytestring, character_encoding)
funciona como se esperaba en Python 3. Aunque unicode_text = bytestring.decode(character_encoding)
es más preferible evitar la confusión con solo str(bytes_obj)
eso produce una representación de texto en bytes_obj
lugar de decodificarlo en texto: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'
ystr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
str(text_bytes)
funciona? Esto me parece extraño.