Convertir bytes en cadenas en Python

     

    Introducción

    En este artículo, veremos cómo convertir bytes en una cadena en Python. Al final de este artículo, tendrá una idea clara de qué son estos tipos y cómo manejar eficazmente los datos usándolos.

    Dependiendo de la versión de Python que esté usando, esta tarea será diferente. Aunque Python 2 ha llegado al final de su vida útil, muchos proyectos todavía lo usan, por lo que incluiremos los enfoques de Python 2 y Python 3.

    Convertir bytes en cadenas en Python 3

    Desde Python 3, la antigua forma ASCII de hacer las cosas tenía que desaparecer y Python se convirtió completamente en Unicode.

    Esto significa que perdimos el tipo Unicode explícito: u"string" – cada String es un u"string"!

    Para diferenciar estas cadenas de las cadenas de bytes antiguas, se nos presenta un nuevo especificador para ellas: el b"string".

    Esto se agregó en Python 2.6, pero no sirvió para otro propósito real que el de prepararse para Python 3, ya que todas las cadenas eran cadenas de bytes en 2.6.

    Las cadenas de bytes en Python 3 se denominan oficialmente bytes, una secuencia inmutable de enteros en el rango 0 <= x <256. Otro bytes-objeto similar agregado en 2.6 es el bytearray – Similar a bytes, pero mutable.

    Convierta Bytes en String con decode ()

    Echemos un vistazo a cómo podemos convertir bytes en una cadena, usando la función incorporada decode() método para el bytes clase:

    >>> b = b"Lets grab a xf0x9fx8dx95!"
    # Let's check the type
    >>> type(b)
    <class 'bytes'>
    
    # Now, let's decode/convert them into a string
    >>> s = b.decode('UTF-8')
    >>> s
    "Let's grab a 🍕!"
    

    Pasando el formato de codificación, hemos decodificado el bytes objeto en una String y lo imprimí.

    Convierta bytes en cadenas con códecs

    Alternativamente, podemos usar el incorporado codecs módulo también para este propósito:

    >>> import codecs
    >>> b = b'Lets grab a xf0x9fx8dx95!'
    
    >>> codecs.decode(b, 'UTF-8')
    "Let's grab a 🍕!"
    

    Sin embargo, realmente no necesita pasar el parámetro de codificación, se recomienda pasarlo:

    >>> codecs.decode(b)
    "Let's grab a 🍕!"
    

    Convierta Bytes en String con str ()

    Finalmente, puede utilizar el str() función, que acepta varios valores y los convierte en cadenas:

    >>> b = b'Lets grab a xf0x9fx8dx95!'
    >>> str(b, 'UTF-8')
    "Let's grab a 🍕!"
    

    Asegúrese de proporcionar el argumento de codificación a str() aunque, de lo contrario, podría obtener algunos resultados inesperados:

    >>> str(b)
    b'Lets grab a xf0x9fx8dx95!'
    

    Esto nos lleva a las codificaciones una vez más. Si especifica la codificación incorrecta, el mejor caso es que su programa se bloquee porque no puede decodificar los datos. Por ejemplo, si intentamos usar el str() funcionar con UTF-16, seríamos recibidos con:

    >>> str(b, 'UTF-16')
    '敌❴u2073牧扡愠uf020趟↕'
    

    Esto es aún más importante dado que a Python 3 le gusta asumir Unicode, por lo que si está trabajando con archivos o fuentes de datos que usan una codificación oscura, asegúrese de prestar especial atención.

    Convertir bytes en cadenas en Python 2

    En Python 2, un paquete de bytes y una cadena son prácticamente lo mismo: las cadenas son objetos que constan de caracteres de 1 byte, lo que significa que cada carácter puede almacenar 256 valores. Por eso a veces se les llama cadenas de bytes.

    Esto es genial cuando se trabaja con datos de bytes; simplemente los cargamos en una variable y estamos listos para imprimir:

    >>> s = "Hello world!"
    
    >>> s
    'Hello world!'
    
    >>> len(s)
    12
    

    Sin embargo, el uso de caracteres Unicode en cadenas de bytes cambia un poco este comportamiento:

    >>> s = "Let's grab a 🍕!"
    
    >>> s
    'Lets grab a xf0x9fx8dx95!'
    # Where has the pizza gone to?
    
    >>> len(s)
    17
    # Shouldn't that be 15?
    

    Convertir bytes a Unicode (Python 2)

    Aquí, tendremos que usar Python 2 Unicode type, que se asume y se usa automáticamente en Python 3. Esto almacena cadenas como una serie de puntos de código, en lugar de bytes.

    los xf0x9fx8dx95 representa bytes como números hexadecimales de dos dígitos, ya que Python no sabe cómo representarlos como caracteres ASCII:

    >>> u = u"Let's grab a 🍕!"
    u"Let's grab a U0001f355!""
    
    >>> u
    "Let's grab a 🍕!"
    # Yum.
    
    >>> len(u)
    15
    

    Como puede ver arriba, la cadena Unicode contiene U0001f355 – ¡un carácter de escape Unicode que nuestro terminal ahora sabe cómo imprimir como una porción de pizza! Configurar esto fue tan fácil como usar el u especificador antes del valor de la cadena de bytes.

    Entonces, ¿cómo cambio entre los dos?

    Puede obtener la cadena Unicode decodificando su cadena de bytes. Esto se puede hacer construyendo un objeto Unicode, proporcionando la cadena de bytes y una cadena que contiene el nombre de codificación como argumentos o llamando .decode(encoding) en una cadena de bytes.

    Convertir bytes en cadenas usando decode () (Python 2)

    También puede utilizar el codecs.encode(s, encoding) desde el codecs módulo.

    >>> s = "Let's grab a xf0x9fx8dx95!"
    >>> u = unicode(s, 'UTF-8')
    
    >>> u
    "Let's grab a 🍕!"
    
    >>> s.decode('UTF-8')
    "Let's grab a 🍕!"
    

    Convertir bytes en cadenas mediante códecs (Python 2)

    O, usando el codecs módulo:

    import codecs
    
    >>> codecs.decode(s, 'UTF-8')
    "Let's grab a 🍕!"
    

    Sea consciente de su codificación

    Una advertencia aquí: los bytes se pueden interpretar de manera diferente en diferentes codificaciones. Con alrededor 80 diferentes codificaciones disponibles listas para usar, ¡puede que no sea fácil saber si tienes la correcta!

    s="xf8xe7"
    
    # This one will let us know we used the wrong encoding
    
    >>> s.decode('UTF-8')
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xf8 in position 0:
    invalid start byte
    
    # These two overlaps and this is a valid string in both
    
    >>> s.decode('latin1')
    øç
    
    s.decode('iso8859_5')
    јч
    

    El mensaje original era øç o јчy ambas parecen ser conversiones válidas.

    Conclusión

    Como programadores, hay algunas cosas en las que debemos pensar constantemente y para las que debemos prepararnos activamente para evitar trampas. Esto es especialmente cierto en los niveles inferiores, a los que rara vez vamos cuando usamos un lenguaje de alto nivel como Python como nuestro controlador diario.

    Cosas como juegos de caracteres, codificaciones y binarios están ahí para recordarnos que nuestro trabajo es código – codificar nuestros pensamientos en soluciones de trabajo. Afortunadamente, gran parte de este pensamiento se convierte en parte de nuestra rutina después de algunas rondas en el teclado.

    En este artículo, hemos repasado cómo convertir bytes a cadenas en Python.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *