Introducción
En este artículo, veremos cómo convertir Bytes a String en Python. Al final de este artículo tendrás una idea clara de lo que son estos tipos y de cómo manejar eficazmente los datos usándolos.
Dependiendo de la versión de Python que estés usando, esta tarea será diferente. Aunque Python 2 ha llegado a su fin de vida, muchos proyectos aún lo utilizan, por lo que incluiremos tanto el enfoque de Python 2 como el de Python 3.
Convertir Bytes a String en Python 3
Desde Python 3, la antigua forma de hacer las cosas en ASCII tuvo que desaparecer, y Python se convirtió completamente en Unicode.
Esto significa que perdimos el tipo unicode explícito: u"string"
– ¡toda cadena es un u"string"
!
Para diferenciar estas cadenas de las viejas bytestrings, se nos presenta un nuevo especificador para ellas – el b"string"
.
Esto se añadió en Python 2.6, pero no sirvió para nada más que para prepararse para Python 3, ya que todas las cadenas eran bytestrings en 2.6.
Los bytestrings en Python 3 se llaman oficialmente bytes
, una secuencia inmutable de enteros en el rango 0 <= x < 256. Otro objeto similar a bytes
añadido en 2.6 es el bytearray
– similar a bytes
, pero mutable.
Convertir Bytes a String con decode()
Veamos cómo podemos convertir bytes a String, utilizando el método incorporado decode()
para la clase bytes
:
Pasando el formato de codificación, hemos descodificado el objeto bytes
en una cadena y lo hemos impreso.
Convertir Bytes a String con codecs
Alternativamente, podemos usar el módulo incorporado codecs
para este propósito también:
>>> import codecs>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> codecs.decode(b, 'UTF-8')"Let's grab a 🍕!"
No es realmente necesario pasar el parámetro de codificación, aunque se aconseja pasarlo:
>>> codecs.decode(b)"Let's grab a 🍕!"
Convertir bytes en cadena con str()
Por último, puedes utilizar la función str()
, que acepta varios valores y los convierte en cadenas:
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'>>> str(b, 'UTF-8')"Let's grab a 🍕!"
Aunque asegúrate de proporcionar el argumento de codificación a str()
, de lo contrario podrías obtener algunos resultados inesperados:
>>> str(b)b'Lets grab a \xf0\x9f\x8d\x95!'
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 la función str()
con UTF-16
, nos encontraríamos con:
>>> str(b, 'UTF-16')'敌❴\u2073牧扡愠\uf020趟↕'
Esto es aún más importante dado que a Python 3 le gusta asumir Unicode – así que si estás trabajando con archivos o fuentes de datos que usan una codificación oscura, asegúrate de prestar atención extra.
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 consisten en caracteres de 1 byte de longitud, lo que significa que cada carácter puede almacenar 256 valores. Por eso a veces se les llama bytestrings.
Esto es genial cuando se trabaja con datos de bytes – simplemente lo cargamos en una variable y estamos listos para imprimir:
>>> s = "Hello world!">>> s'Hello world!'>>> len(s)12
Usar caracteres Unicode en bytestrings cambia un poco este comportamiento sin embargo:
>>> s = "Let's grab a 🍕!">>> s'Lets grab a \xf0\x9f\x8d\x95!'# Where has the pizza gone to?>>> len(s)17# Shouldn't that be 15?
Convertir bytes a Unicode (Python 2)
Aquí, tendremos que usar el tipo Unicode
de Python 2, que se asume y se usa automáticamente en Python 3. Este almacena las cadenas como una serie de puntos de código, en lugar de bytes.
El \xf0\x9f\x8d\x95
representa los 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 puedes ver arriba, la cadena Unicode contiene \U0001f355
– ¡un carácter escapado Unicode que nuestro terminal ahora sabe imprimir como una porción de pizza! Establecer esto fue tan fácil como usar el especificador u
antes del valor del bytestring.
Entonces, ¿cómo cambio entre los dos?
Puedes obtener la cadena Unicode decodificando tu bytestring. Esto puede hacerse construyendo un objeto Unicode, proporcionando la cadena de bytes y una cadena que contenga el nombre de la codificación como argumentos o llamando a .decode(encoding)
sobre una cadena de bytes.
Convertir bytes en cadena usando decode() (Python 2)
También puedes usar el codecs.encode(s, encoding)
del módulo codecs
.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!">>> u = unicode(s, 'UTF-8')>>> u"Let's grab a 🍕!">>> s.decode('UTF-8')"Let's grab a 🍕!"
Convertir bytes en cadena usando codecs (Python 2)
O bien, usando el módulo codecs
:
import codecs>>> codecs.decode(s, 'UTF-8')"Let's grab a 🍕!"
Tenga en cuenta su codificación
Una palabra de precaución aquí – los bytes pueden ser interpretados de manera diferente en diferentes codificaciones. Con alrededor de 80 codificaciones diferentes disponibles, puede que no sea fácil saber si tienes la correcta
El mensaje original era øç
o јч
, y ambos parecen ser conversiones válidas.
Conclusión
Como programadores, hay algunas cosas en las que debemos pensar constantemente y prepararnos activamente para evitar trampas. Esto es especialmente cierto en los niveles inferiores, donde rara vez vamos cuando usamos un lenguaje de alto nivel como Python como nuestro conductor diario.
Caracteres como conjuntos de caracteres, codificaciones y binarios están ahí para recordarnos que nuestro trabajo es codificar – para codificar nuestros pensamientos en soluciones de trabajo. Afortunadamente, mucho de este pensamiento se convierte en parte de nuestra rutina después de unas cuantas rondas en el teclado.
En este artículo, hemos repasado cómo convertir bytes a Strings en Python.