Con la llegada de Python 3, el tipo bytes se convirtió en la principal forma de almacenar y procesar datos binarios, separándose de las cadenas (str). En Python 2, las cadenas (str) podían contener tanto texto como bytes, lo que causaba errores frecuentes al procesar datos en diferentes codificaciones.
En la programación diaria, a menudo nos enfrentamos a tareas de transmisión y almacenamiento de datos fuera del contexto de la información textual, por ejemplo, al trabajar con archivos, solicitudes de red y protocolos de intercambio. Para esto se necesita un tipo claro, conveniente y seguro que distinga claramente la secuencia de bytes de los datos textuales.
El tipo bytes en Python almacena una secuencia inmutable de bytes (números enteros de 0 a 255) y se puede crear a partir de un literal de bytes (con el prefijo b) o mediante una conversión explícita de tipos. Para una interacción segura y predecible entre cadenas (str) y bytes (bytes), se utilizan los métodos .encode() y .decode(). Al trabajar con archivos, redes y varios protocolos binarios, bytes es la opción principal.
Ejemplo de código:
# Creación de un objeto bytes b = b'hello' # A través de un literal b2 = bytes([104, 101, 108, 108, 111]) # De una lista de números enteros # Conversión str <=> bytes text = 'текст' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Ejemplo con un archivo with open('file.bin', 'rb') as f: data = f.read() # data: bytes
Características clave:
¿Se pueden concatenar bytes y str en una sola variable?
No, la concatenación mediante + o cadenas f no funciona: si intentas ejecutar b'abc' + 'def', se generará un TypeError. Se necesita convertir explícitamente los tipos.
¿En qué se diferencia bytes de bytearray?
bytes es un tipo inmutable, es decir, el contenido no se puede modificar después de su creación. bytearray es una variante mutable que admite métodos para cambiar bytes en su lugar.
b = bytes([1, 2, 3]) # inmutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # OK b[0] = 99 # TypeError
¿Cómo saber cuántos bytes ocupará una cadena al convertirse a través de encode()?
El número de bytes depende de la codificación. Por ejemplo, para 'abc' en utf-8 son 3 bytes, y para 'Привет' son 12. Solo después de llamar a encode() se puede conocer el tamaño exacto a través de len():
s = 'Привет' # 6 letras b = s.encode('utf-8') # 12 bytes print(len(b)) # 12
Un desarrollador lee un archivo en modo 'rb' (byte) y trata de procesarlo directamente como una cadena:
with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes
Ventajas:
Desventajas:
Un desarrollador procesa flujos de bytes a través de decode(), introduciendo control de codificación:
with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())
Ventajas:
Desventajas: