Convertir bytes en una cadena

3006

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 comunica () 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 es el método binascii.b2a_qp () , pero cuando lo probé, obtuve la misma matriz 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 a una cadena? Quiero decir, usando las "baterías" en lugar de hacerlo manualmente. Y me gustaría que estuviera bien con Python 3.

4
  • 101
    ¿por qué no str(text_bytes)funciona? Esto me parece extraño. Charlie Parker 14/03/19 a las 22:25
  • 28
    @CharlieParker Porque str(text_bytes)no se puede especificar la codificación. Dependiendo de lo que haya en text_bytes, text_bytes.decode('cp1250) `podría resultar en una cadena muy diferente a text_bytes.decode('utf-8'). Craig Anderson 31/03/19 a las 17:32
  • 11
    por lo que la strfunción ya no se convierte en una cadena real. Uno TIENE que decir una codificación explícitamente por alguna razón, soy demasiado vago para leer el por qué. Simplemente conviértalo utf-8y vea si su código funciona. por ejemplovar = var.decode('utf-8')Charlie Parker 22/04/19 a las 23:32
  • 9
    @CraigAnderson: 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 confusiones con solo str(bytes_obj)eso produce una representación de texto en bytes_objlugar de decodificarlo en texto: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'ystr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'jfs 12 abr.20 a las 5:11
4698

Necesita decodificar el objeto bytes para producir una cadena:

>>> 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'
17
  • 74
    El uso "windows-1252"tampoco es confiable (por ejemplo, para otras versiones de idioma de Windows), ¿no sería mejor usarlo sys.stdout.encoding? nikow 3 de enero de 2012 a las 15:20
  • 15
    Tal vez esto ayude a alguien más: a veces usa una matriz de bytes para la comunicación ex TCP. Si desea convertir una matriz de bytes en una cadena que corta los caracteres '\ x00' finales, la siguiente respuesta no es suficiente. Utilice b'example \ x00 \ x00'.decode ('utf-8'). Strip ('\ x00') luego. Wookie88 16/04/13 a las 13:27
  • 2
    He solucionado un error sobre cómo documentarlo en bugs.python.org/issue17860 ; siéntase libre de proponer un parche. Si es difícil contribuir, los comentarios sobre cómo mejorar son bienvenidos. anatoly techtonik 28/04/13 a las 14:40
  • 60
    En Python 2.7.6 no maneja b"\x80\x02\x03".decode("utf-8")-> UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte. martineau 18 de mayo de 2014 y 20:12
  • dieciséis
    Si el contenido son valores binarios aleatorios, utf-8es probable que la conversión falle. En su lugar, vea la respuesta de @techtonik (a continuación) stackoverflow.com/a/27527728/198536wallyk 27 de mayo de 2015 a las 21:21
309

Debe decodificar la cadena de bytes y convertirla en una cadena de caracteres (Unicode).

En Python 2

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

o

unicode('hello', encoding)

En Python 3

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

o

str(b'hello', encoding)
4
  • 3
    En Python 3, ¿qué pasa si la cadena está en una variable? Alaa M. 27 feb.20 a las 14:47
  • 1
    @AlaaM .: lo mismo. Si es así variable = b'hello', entoncesunicode_text = variable.decode(character_encoding) ... jfs 12 abr.20 a las 5:03
  • 3
    para mí, variable = variable.decode()automáticamente lo puse en un formato de cadena que quería. Alex Hall 19 de julio de 2020 a las 3:41
  • 2
    @AlexHall> fwiw, es posible que le interese saber que automagic usa utf8, que es el valor predeterminado para encodingarg si no lo proporciona. Verbytes.decodespectras 17 abr a las 11:12
228

Creo que de esta manera es fácil:

>>> bytes_data = [112, 52, 52]
>>> "".join(map(chr, bytes_data))
'p44'
13
  • 6
    Gracias, su método funcionó para mí cuando ningún otro lo hizo. Tenía una matriz de bytes no codificada que necesitaba convertir en una cadena. Estaba tratando de encontrar una manera de volver a codificarlo para poder decodificarlo en una cadena. ¡Este método funciona perfectamente! leetNightshade 10 de mayo de 2014 a las 0:28
  • 6
    @leetNightshade: sin embargo, es terriblemente ineficiente. Si tiene una matriz de bytes, solo necesita decodificar. Martijn Pieters 1 de septiembre de 2014 a las 16:25
  • dieciséis
    @Martijn Pieters Acabo de hacer una prueba comparativa simple con estas otras respuestas, ejecutando múltiples 10,000 ejecuciones stackoverflow.com/a/3646405/353094 Y la solución anterior fue en realidad mucho más rápida cada vez. Para 10,000 ejecuciones en Python 2.7.7, toma 8 ms, en comparación con las otras a 12 ms y 18 ms. De acuerdo, podría haber alguna variación dependiendo de la entrada, la versión de Python, etc. No me parece demasiado lento. leetNightshade 1 de septiembre de 2014 a las 17:06
  • 5
    @Martijn Pieters Sí. Entonces, con ese punto, esta no es la mejor respuesta para el cuerpo de la pregunta que se hizo. Y el título es engañoso, ¿no? Quiere convertir una cadena de bytes en una cadena normal, no una matriz de bytes en una cadena. Esta respuesta funciona bien para el título de la pregunta que se hizo. leetNightshade 1 de septiembre de 2014 a las 17:28
  • 7
    Para Python 3, esto debería ser equivalente a bytes([112, 52, 52])- por cierto, bytes es un mal nombre para una variable local exactamente porque es una p3 incorporadaMr_and_Mrs_D 11/10/2017 a las 15:14
112

Si no conoce la codificación, para leer la entrada binaria en una cadena en forma compatible con Python 3 y Python 2, use la antigua codificación CP437 de MS-DOS :

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('cp437'))

Debido a que la codificación es desconocida, espere que los símbolos que no están en inglés se traduzcan a caracteres de cp437(los caracteres en inglés no se traducen porque coinciden en la mayoría de las codificaciones de un solo byte y UTF-8).

Decodificar una entrada binaria arbitraria a UTF-8 no es seguro, porque puede obtener esto:

>>> b'\x00\x01\xffsd'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid
start byte

Lo mismo se aplica a latin-1, que era popular (¿el predeterminado?) Para Python 2. Vea los puntos que faltan en el diseño de la página de códigos : es donde Python se ahoga con infames ordinal not in range.

ACTUALIZACIÓN 20150604 : Hay rumores de que Python 3 tiene la surrogateescapeestrategia de error para codificar cosas en datos binarios sin pérdida de datos y fallas, pero necesita pruebas de conversión [binary] -> [str] -> [binary], para validar tanto el rendimiento como la confiabilidad.

ACTUALIZACIÓN 20170116 : Gracias al comentario de Nearoo, también existe la posibilidad de eliminar todos los bytes desconocidos con el backslashreplacecontrolador de errores. Eso funciona solo para Python 3, por lo que incluso con esta solución, seguirá obteniendo resultados inconsistentes de diferentes versiones de Python:

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('utf-8', 'backslashreplace'))

Consulte la compatibilidad con Unicode de Python para obtener más detalles.

ACTUALIZACIÓN 20170119 : Decidí implementar la decodificación de escape de barra que funciona tanto para Python 2 como para Python 3. Debería ser más lento que la cp437solución, pero debería producir resultados idénticos en cada versión de Python.

# --- preparation

import codecs

def slashescape(err):
    """ codecs error handler. err is UnicodeDecode instance. return
    a tuple with a replacement for the unencodable part of the input
    and a position where encoding should continue"""
    #print err, dir(err), err.start, err.end, err.object[:err.start]
    thebyte = err.object[err.start:err.end]
    repl = u'\\x'+hex(ord(thebyte))[2:]
    return (repl, err.end)

codecs.register_error('slashescape', slashescape)

# --- processing

stream = [b'\x80abc']

lines = []
for line in stream:
    lines.append(line.decode('utf-8', 'slashescape'))
12
  • 6
    Realmente siento que Python debería proporcionar un mecanismo para reemplazar los símbolos que faltan y continuar. anatoly techtonik 20 feb 2015 a las 9:04
  • @techtonik: esto no funcionará en una matriz como lo hizo en python2. user2284570 20/10/15 a las 23:02
  • @ user2284570 ¿te refieres a la lista? ¿Y por qué debería funcionar en matrices? Especialmente las matrices de los flotadores ..anatoly techtonik 22/10/15 a las 7:25
  • 2
    También puede simplemente ignorar los errores de Unicode b'\x00\x01\xffsd'.decode('utf-8', 'ignore')en Python 3.Antonis Kalou 6 de julio de 2016 a las 12:14
  • 3
    @anatolytechtonik Existe la posibilidad de dejar la secuencia de escape en la cadena y seguir adelante: b'\x80abc'.decode("utf-8", "backslashreplace")resultará en '\\x80abc'. Esta información se tomó de la página de documentación de Unicode que parece haberse actualizado desde la redacción de esta respuesta. Nearoo 16 de enero de 2017 a las 10:40
107

En Python 3 , la codificación predeterminada es "utf-8", por lo que puede usar directamente:

b'hello'.decode()

que es equivalente a

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

Por otro lado, en Python 2 , la codificación predeterminada es la codificación de cadena predeterminada. Por lo tanto, debes usar:

b'hello'.decode(encoding)

dónde encodingestá la codificación que desea.

Nota: se agregó soporte para argumentos de palabras clave en Python 2.7.

0
48

Creo que realmente quieres esto:

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

La respuesta de Aaron fue correcta, excepto que necesita saber qué codificación usar. Y creo que Windows usa 'windows-1252'. Solo importará si tiene algunos caracteres inusuales (no ASCII) en su contenido, pero entonces marcará la diferencia.

Por cierto, el hecho de que importe es la razón por la que Python pasó a usar dos tipos diferentes para datos binarios y de texto: no puede convertir mágicamente entre ellos, ¡porque no conoce la codificación a menos que usted lo diga! La única forma en que USTED lo sabría es leer la documentación de Windows (o leerla aquí).

3
  • 3
    open()función para flujos de texto o, Popen()si la pasa, universal_newlines=Truedecida mágicamente la codificación de caracteres por usted ( locale.getpreferredencoding(False)en Python 3.3+). jfs 21 feb 2014 a las 17:00
  • 2
    'latin-1'es una codificación literal con todos los puntos de código establecidos, por lo que puede usarla para leer de manera efectiva una cadena de bytes en cualquier tipo de cadena que admita su Python (es decir, literalmente en Python 2, en Unicode para Python 3). tripleee 17 de febrero de 2017 a las 7:32
  • @tripleee: 'latin-1'es una buena forma de conseguir mojibake. También hay una sustitución mágica en Windows: es sorprendentemente difícil canalizar datos de un proceso a otro sin modificar, por ejemplo dir: \xb6-> \x14(el ejemplo al final de mi respuesta)jfs 12 abr.20 a las 5:00
36

Establezca universal_newlines en True, es decir

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]
2
  • 5
    He estado usando este método y funciona. Aunque, solo se trata de adivinar la codificación en función de las preferencias del usuario en su sistema, por lo que no es tan sólido como algunas otras opciones. Esto es lo que está haciendo, haciendo referencia a docs.python.org/3.4/library/subprocess.html: "Si universal_newlines es True, [stdin, stdout y stderr] se abrirán como flujos de texto en modo universal de nuevas líneas usando la codificación devuelta por la configuración regional .getpreferredencoding (falso) ". twasbrillig 1 mar 14 a las 22:43
  • 2
    En 3.7 puede (y debe) hacer en text=Truelugar de universal_newlines=True. Boris 13/01/19 a las 17:02
32

Para interpretar una secuencia de bytes como texto, debe conocer la codificación de caracteres correspondiente:

unicode_text = bytestring.decode(character_encoding)

Ejemplo:

>>> b'\xc2\xb5'.decode('utf-8')
'µ'

lsEl comando puede producir una salida que no se puede interpretar como texto. Los nombres de archivo en Unix pueden ser cualquier secuencia de bytes excepto barra b'/'y cero b'\0':

>>> open(bytes(range(0x100)).translate(None, b'\0/'), 'w').close()

Intentar decodificar tal sopa de bytes usando la codificación utf-8 aumenta UnicodeDecodeError.

Puede ser peor. La decodificación puede fallar silenciosamente y producir mojibake si usa una codificación incompatible incorrecta:

>>> '—'.encode('utf-8').decode('cp1252')
'—'

Los datos están dañados, pero su programa no se da cuenta de que se ha producido un error.

En general, qué codificación de caracteres usar no está incrustada en la propia secuencia de bytes. Tienes que comunicar esta información fuera de banda. Algunos resultados son más probables que otros y, por lo tanto chardet, existe un módulo que puede adivinar la codificación de caracteres. Una sola secuencia de comandos de Python puede usar múltiples codificaciones de caracteres en diferentes lugares.


lsde salida se puede convertir en una cadena utilizando Python os.fsdecode() función que tiene éxito incluso para los nombres de archivo descodificable (utiliza sys.getfilesystemencoding()y surrogateescapecontrolador de errores en Unix):

import os
import subprocess

output = os.fsdecode(subprocess.check_output('ls'))

Para obtener los bytes originales, puede usar os.fsencode().

Si pasa el universal_newlines=Trueparámetro, se subprocessutiliza locale.getpreferredencoding(False)para decodificar bytes, por ejemplo, puede estar cp1252en Windows.

Para decodificar el flujo de bytes sobre la marcha, io.TextIOWrapper() se puede utilizar: ejemplo .

Los diferentes comandos pueden usar diferentes codificaciones de caracteres para su salida, por ejemplo, direl comando interno ( cmd) puede usar cp437. Para decodificar su salida, puede pasar la codificación explícitamente (Python 3.6+):

output = subprocess.check_output('dir', shell=True, encoding='cp437')

Los nombres de archivo pueden diferir de os.listdir()(que usa la API de Windows Unicode), por ejemplo, '\xb6'se pueden sustituir con '\x14'mapas de códec cp437 de Python b'\x14'para controlar el carácter U + 0014 en lugar de U + 00B6 (¶). Para admitir nombres de archivo con caracteres Unicode arbitrarios, consulte Decodificar la salida de PowerShell que posiblemente contenga caracteres Unicode no ASCII en una cadena de Python

31

Dado que esta pregunta en realidad se refiere a la subprocesssalida, tiene más enfoques directos disponibles. El más moderno sería usar subprocess.check_outputy pasar text=True(Python 3.7+) para decodificar automáticamente stdout usando la codificación predeterminada del sistema:

text = subprocess.check_output(["ls", "-l"], text=True)

Para Python 3.6, Popenacepta una palabra clave de codificación :

>>> from subprocess import Popen, PIPE
>>> text = Popen(['ls', '-l'], stdout=PIPE, encoding='utf-8').communicate()[0]
>>> type(text)
str
>>> print(text)
total 0
-rw-r--r-- 1 wim badger 0 May 31 12:45 some_file.txt

La respuesta general a la pregunta del título, si no se trata de la salida del subproceso, es decodificar bytes en texto:

>>> b'abcde'.decode()
'abcde'

Sin argumento, sys.getdefaultencoding()se utilizará. Si sus datos no lo son sys.getdefaultencoding(), debe especificar la codificación explícitamente en la decodellamada:

>>> b'caf\xe9'.decode('cp1250')
'café'
2
  • La decodificación de la lssalida mediante la utf-8codificación puede fallar (consulte el ejemplo en mi respuesta de 2016 ). jfs 27/11/19 a las 17:18
  • 1
    @Boris: si encodingse proporciona un parámetro, el textparámetro se ignora. jfs 27/11/19 a las 17:18
26

Si bien la respuesta de @Aaron Maenpaa simplemente funciona, un usuario preguntó recientemente :

Is there any more simply way? 'fhand.read().decode("ASCII")' [...] It's so long!

Puedes usar:

command_stdout.decode()

decode()tiene un argumento estándar :

codecs.decode(obj, encoding='utf-8', errors='strict')

1
  • .decode()que los usos 'utf-8'pueden fallar (la salida del comando puede usar una codificación de caracteres diferente o incluso devolver una secuencia de bytes no codificable). Aunque si la entrada es ascii (un subconjunto de utf-8), entonces .decode()funciona. jfs 12 abr.20 a las 4:39
16

Si debe obtener lo siguiente al intentarlo decode():

AttributeError: 'str' object has no attribute 'decode'

También puede especificar el tipo de codificación directamente en un reparto:

>>> my_byte_str
b'Hello World'

>>> str(my_byte_str, 'utf-8')
'Hello World'
8

Hice una función para limpiar una lista

def cleanLists(self, lista):
    lista = [x.strip() for x in lista]
    lista = [x.replace('\n', '') for x in lista]
    lista = [x.replace('\b', '') for x in lista]
    lista = [x.encode('utf8') for x in lista]
    lista = [x.decode('utf8') for x in lista]

    return lista
2
  • 6
    En realidad se puede encadenar todos los .strip, .replace, .encodellamadas, etc en una lista por comprensión y sólo iterar sobre la lista una vez en lugar de la iteración más de cinco veces. Taylor Edmiston 11/06/17 a las 19:04
  • 1
    @TaylorEdmiston Tal vez ahorre en la asignación, pero el número de operaciones seguirá siendo el mismo. JulienD 28/07/2017 a las 7:13
8

Al trabajar con datos de sistemas Windows (con \r\nfinales de línea), mi respuesta es

String = Bytes.decode("utf-8").replace("\r\n", "\n")

¿Por qué? Intente esto con un Input.txt multilínea:

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8")
open("Output.txt", "w").write(String)

Todas las terminaciones de sus líneas se duplicarán (a \r\r\n), lo que generará líneas vacías adicionales. Las funciones de lectura de texto de Python normalmente normalizan los finales de línea para que las cadenas solo se utilicen \n. Si recibe datos binarios de un sistema Windows, Python no tiene la oportunidad de hacerlo. Por lo tanto,

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8").replace("\r\n", "\n")
open("Output.txt", "w").write(String)

replicará su archivo original.

1
  • Estuve buscando .replace("\r\n", "\n")adiciones durante tanto tiempo. Esta es la respuesta si desea renderizar HTML correctamente. mhlavacka 20 feb 2019 a las 9:45
8

Para Python 3, este es un enfoque Pythonic mucho más seguro para convertir de bytea string:

def byte_to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes): # Check if it's in bytes
        print(bytes_or_str.decode('utf-8'))
    else:
        print("Object not of byte type")

byte_to_str(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')

Producción:

total 0
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2
1
  • 6
    1) Como dijo @bodangly, la verificación de tipos no es pitónica en absoluto. 2) La función que escribió se llama " byte_to_str", lo que implica que devolverá una cadena, pero solo imprime el valor convertido e imprime un mensaje de error si falla (pero no genera una excepción). Este enfoque tampoco es pitónico y confunde la bytes.decodesolución que proporcionó. cosmicFluke 25 de mayo de 2018 a las 19:51
4

Para su caso específico de "ejecutar un comando de shell y obtener su salida como texto en lugar de bytes", en Python 3.7, debe usar subprocess.runy pasar text=True(así como capture_output=Truepara capturar la salida)

command_result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
command_result.stdout  # is a `str` containing your program's stdout

textsolía llamarse universal_newlines, y se cambió (bueno, alias) en Python 3.7. Si desea admitir versiones de Python anteriores a la 3.7, pase en universal_newlines=Truelugar detext=True

4

Desde sys - Parámetros y funciones específicos del sistema :

Para escribir o leer datos binarios desde / hacia los flujos estándar, use el búfer binario subyacente. Por ejemplo, para escribir bytes en stdout, use sys.stdout.buffer.write(b'abc').

1
  • 3
    La tubería al subproceso ya es un búfer binario. Su respuesta no aborda cómo obtener un valor de cadena del valor resultante bytes. Martijn Pieters 1 de septiembre de 2014 a las 17:34
2
def toString(string):    
    try:
        return v.decode("utf-8")
    except ValueError:
        return string

b = b'97.080.500'
s = '97.080.500'
print(toString(b))
print(toString(s))
2
  • 1
    Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo para la persona que pregunta ahora! Por favor, editar su respuesta a añadir una explicación, y dar una indicación de lo que se aplican limitaciones y supuestos. Tampoco está de más mencionar por qué esta respuesta es más apropiada que otras. Dev-iL 4 de junio de 2018 a las 5:37
  • Una explicación estaría en orden. Peter Mortensen 28/09/19 a las 11:13
2

Si desea convertir bytes, no solo cadenas convertidas a bytes:

with open("bytesfile", "rb") as infile:
    str = base64.b85encode(imageFile.read())

with open("bytesfile", "rb") as infile:
    str2 = json.dumps(list(infile.read()))

Sin embargo, esto no es muy eficaz. Convertirá una imagen de 2 MB en 9 MB.

2

prueba esto

bytes.fromhex('c3a9').decode('utf-8') 
0
1

Decodificar con .decode(). Esto decodificará la cadena. Pase 'utf-8') como el valor en el interior.

0

Intente usar este; esta función ignorará todos los utf-8binarios sin juego de caracteres (como ) y devolverá una cadena limpia. Está probado para python3.6y por encima.

def bin2str(text, encoding = 'utf-8'):
    """Converts a binary to Unicode string by removing all non Unicode char
    text: binary string to work on
    encoding: output encoding *utf-8"""

    return text.decode(encoding, 'ignore')

Aquí, la función tomará el binario y lo decodificará (convierte los datos binarios en caracteres usando el juego de caracteres predefinido de Python y el ignoreargumento ignora todos los datos que no son del juego de caracteres de su binario y finalmente devuelve el stringvalor deseado .

Si no está seguro de la codificación, utilice sys.getdefaultencoding()para obtener la codificación predeterminada de su dispositivo.