None y Datos Binarios
Desliza para mostrar el menú
Los programas reales gestionan valores ausentes y datos binarios. Utilizar None para indicar "sin valor" y bytes/bytearray para contenido binario en bruto. Conocer cuándo es apropiado cada uno y cómo convertir de forma segura entre texto y bytes.
None para "Sin valor"
None es un único objeto que significa "nada aquí".
1234567result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")
Utilizar is None en lugar de comprobaciones de veracidad, ya que 0 y "" también son valores falsos.
123value = 0 print(not value) # True print(value is None) # False
Valores predeterminados y alternativas
None se utiliza como un marcador claro de que un valor falta intencionalmente. Permite distinguir entre "no se proporcionó valor" y valores válidos como 0 o "", haciendo que los valores predeterminados y las alternativas sean más seguros y predecibles.
1234567x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0
Funciones y parámetros
Este ejemplo muestra cómo una función utiliza un parámetro establecido en None como señal de que no se proporcionó ninguna etiqueta. Esto permite que la función asigne un valor predeterminado seguro, mientras que el usuario aún puede sobrescribirlo si es necesario.
1234567def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello
Datos binarios
str almacena texto, bytes y bytearray almacenan valores de bytes en bruto.
1234b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65
Codificación y decodificación
La codificación convierte texto en bytes para que pueda almacenarse o transferirse de manera confiable, mientras que la decodificación restaura esos bytes a texto legible. El uso de una codificación definida como UTF-8 garantiza que los caracteres se conserven correctamente.
123text = "café" data = text.encode("utf-8") back = data.decode("utf-8")
Datos binarios en la práctica
Uso de bytes y bytearray para manejar información binaria en bruto. Estos tipos son esenciales para tareas donde los datos no son solo texto, tales como:
- Lectura y escritura de archivos en modo binario (como imágenes, audio o archivos ejecutables);
- Envío y recepción de datos a través de redes, donde se deben transmitir secuencias exactas de bytes;
- Análisis o construcción de protocolos binarios, por ejemplo, al comunicarse con hardware o APIs de bajo nivel.
bytes vs bytearray
- Los objetos
bytesson inmutables: no se puede cambiar su contenido después de crearlos. Úselos cuando se necesiten datos binarios fijos, como el contenido de archivos o hashes criptográficos; - Los objetos
bytearrayson mutables: se puede modificar su contenido en el lugar. Esto es útil para construir o editar datos binarios antes de guardarlos o enviarlos.
Ejemplo: Modificación de datos binarios
# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72 # Change 'h' (104) to 'H' (72)
print(data_mutable) # bytearray(b'Hello')
Conversión entre bytes y bytearray
- Convertir
bytesabytearraypara permitir modificaciones:
b = b"data"
ba = bytearray(b)
- Convertir
bytearrayde nuevo abytespara almacenamiento o transmisión:
ba = bytearray(b"abc")
b = bytes(ba)
Codificación y decodificación
- Usar
.encode()en una cadena para obtener un objetobytescon una codificación específica (como UTF-8); - Usar
.decode()en un objetobytesobytearraypara obtener una cadena.
Esto es crucial al trabajar con entrada/salida de archivos o datos de red, donde a menudo se reciben o envían bytes en bruto y es necesario convertirlos a texto legible o desde él.
Casos de uso típicos
- Entrada/Salida de archivos:
- Abrir archivos en modo binario (
"rb"o"wb") para leer o escribir bytes exactos.
- Abrir archivos en modo binario (
- Datos de red:
- La comunicación por sockets envía y recibe datos como bytes.
- Protocolos binarios:
- Construcción o análisis de paquetes usando
bytearraypara ediciones eficientes en el lugar.
- Construcción o análisis de paquetes usando
Comprender cuándo usar cada tipo ayuda a escribir código robusto para el manejo de datos en situaciones reales.
Casos de uso típicos para Bytes y Bytearray
Se utilizan bytes y bytearray al trabajar directamente con datos binarios en bruto, en lugar de texto. Estos tipos son esenciales en varios escenarios:
- Lectura o escritura de archivos binarios, como imágenes, audio o ejecutables;
- Manejo de datos de red, ya que los sockets envían y reciben bytes, no cadenas de texto;
- Interacción con protocolos binarios, donde se deben construir o analizar mensajes como secuencias de bytes.
bytes es una secuencia inmutable, lo que significa que no se puede cambiar su contenido después de crearlo. Esto es ideal cuando se necesita asegurar que los datos permanezcan sin cambios, como al leer un archivo o recibir un paquete de red.
bytearray es mutable, por lo que se puede modificar su contenido en el lugar. Utilice bytearray cuando sea necesario construir un mensaje, alterar partes de un búfer o manipular datos binarios de manera eficiente antes de enviarlos o guardarlos.
Cuándo usar cada uno:
- Usar
bytespara datos binarios fijos y de solo lectura, como el contenido de archivos o mensajes de red que no necesitan modificarse; - Usar
bytearraycuando sea necesario editar, agregar o modificar los datos binarios antes de su procesamiento o transmisión.
Conversión entre bytes y bytearray
Se puede convertir fácilmente entre objetos bytes (inmutables) y bytearray (mutables) en Python. Esto permite elegir el tipo adecuado según las necesidades—bytes para datos fijos, bytearray cuando se necesita modificar el contenido.
- Usar el constructor
bytes()para convertir unbytearrayen un objetobytesinmutable; - Usar el constructor
bytearray()para crear una copia mutable a partir de un objetobytes.
Esto es útil cuando se necesita editar datos binarios (usando bytearray), y luego fijarlos (usando bytes) para almacenamiento o transmisión segura.
raw = bytearray(b"data")
raw[0] = 68 # Change first byte to 'D'
locked = bytes(raw) # Convert to immutable bytes
b = b"example"
mutable = bytearray(b) # Convert to mutable bytearray
mutable.append(33) # Add '!' (ASCII 33)
Una vez convertido a bytes, no se puede cambiar el contenido. Utilice bytearray cuando sea necesario editar datos binarios antes de finalizarlos como bytes.
1234567891011# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")
Diferencias de longitud
Algunos caracteres ocupan un elemento de texto pero varios bytes, por lo que su longitud en str y en la forma codificada puede diferir. Esto ocurre porque codificaciones como UTF-8 pueden usar más de un byte para representar un solo carácter.
123ch = "é" len(ch) # 1 len(ch.encode()) # 2
Archivos
Los archivos binarios deben abrirse en modo "rb" para que sus bytes sin procesar se lean exactamente como están almacenados. Esto evita que Python intente interpretar los datos como texto.
# with open("example.png", "rb") as f:
# blob = f.read()
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
None y Datos Binarios
Los programas reales gestionan valores ausentes y datos binarios. Utilizar None para indicar "sin valor" y bytes/bytearray para contenido binario en bruto. Conocer cuándo es apropiado cada uno y cómo convertir de forma segura entre texto y bytes.
None para "Sin valor"
None es un único objeto que significa "nada aquí".
1234567result = None email = None print(result is None) # True print(email is None) # True if result is None: print("No result yet")
Utilizar is None en lugar de comprobaciones de veracidad, ya que 0 y "" también son valores falsos.
123value = 0 print(not value) # True print(value is None) # False
Valores predeterminados y alternativas
None se utiliza como un marcador claro de que un valor falta intencionalmente. Permite distinguir entre "no se proporcionó valor" y valores válidos como 0 o "", haciendo que los valores predeterminados y las alternativas sean más seguros y predecibles.
1234567x = None print(x or "unknown") # 'unknown' print("unknown" if x is None else x) x = 0 print(x or "unknown") # 'unknown' print("unknown" if x is None else x) # 0
Funciones y parámetros
Este ejemplo muestra cómo una función utiliza un parámetro establecido en None como señal de que no se proporcionó ninguna etiqueta. Esto permite que la función asigne un valor predeterminado seguro, mientras que el usuario aún puede sobrescribirlo si es necesario.
1234567def add_tag(text, tag=None): if tag is None: tag = "general" return f"[{tag}] {text}" print(add_tag("hello")) # [general] hello print(add_tag("hello", "news")) # [news] hello
Datos binarios
str almacena texto, bytes y bytearray almacenan valores de bytes en bruto.
1234b1 = b"hello" b2 = bytes([72, 105]) buf = bytearray(b"abc") buf[0] = 65
Codificación y decodificación
La codificación convierte texto en bytes para que pueda almacenarse o transferirse de manera confiable, mientras que la decodificación restaura esos bytes a texto legible. El uso de una codificación definida como UTF-8 garantiza que los caracteres se conserven correctamente.
123text = "café" data = text.encode("utf-8") back = data.decode("utf-8")
Datos binarios en la práctica
Uso de bytes y bytearray para manejar información binaria en bruto. Estos tipos son esenciales para tareas donde los datos no son solo texto, tales como:
- Lectura y escritura de archivos en modo binario (como imágenes, audio o archivos ejecutables);
- Envío y recepción de datos a través de redes, donde se deben transmitir secuencias exactas de bytes;
- Análisis o construcción de protocolos binarios, por ejemplo, al comunicarse con hardware o APIs de bajo nivel.
bytes vs bytearray
- Los objetos
bytesson inmutables: no se puede cambiar su contenido después de crearlos. Úselos cuando se necesiten datos binarios fijos, como el contenido de archivos o hashes criptográficos; - Los objetos
bytearrayson mutables: se puede modificar su contenido en el lugar. Esto es útil para construir o editar datos binarios antes de guardarlos o enviarlos.
Ejemplo: Modificación de datos binarios
# Create a bytes object (immutable)
data = b"hello"
# Create a mutable copy
data_mutable = bytearray(data)
data_mutable[0] = 72 # Change 'h' (104) to 'H' (72)
print(data_mutable) # bytearray(b'Hello')
Conversión entre bytes y bytearray
- Convertir
bytesabytearraypara permitir modificaciones:
b = b"data"
ba = bytearray(b)
- Convertir
bytearrayde nuevo abytespara almacenamiento o transmisión:
ba = bytearray(b"abc")
b = bytes(ba)
Codificación y decodificación
- Usar
.encode()en una cadena para obtener un objetobytescon una codificación específica (como UTF-8); - Usar
.decode()en un objetobytesobytearraypara obtener una cadena.
Esto es crucial al trabajar con entrada/salida de archivos o datos de red, donde a menudo se reciben o envían bytes en bruto y es necesario convertirlos a texto legible o desde él.
Casos de uso típicos
- Entrada/Salida de archivos:
- Abrir archivos en modo binario (
"rb"o"wb") para leer o escribir bytes exactos.
- Abrir archivos en modo binario (
- Datos de red:
- La comunicación por sockets envía y recibe datos como bytes.
- Protocolos binarios:
- Construcción o análisis de paquetes usando
bytearraypara ediciones eficientes en el lugar.
- Construcción o análisis de paquetes usando
Comprender cuándo usar cada tipo ayuda a escribir código robusto para el manejo de datos en situaciones reales.
Casos de uso típicos para Bytes y Bytearray
Se utilizan bytes y bytearray al trabajar directamente con datos binarios en bruto, en lugar de texto. Estos tipos son esenciales en varios escenarios:
- Lectura o escritura de archivos binarios, como imágenes, audio o ejecutables;
- Manejo de datos de red, ya que los sockets envían y reciben bytes, no cadenas de texto;
- Interacción con protocolos binarios, donde se deben construir o analizar mensajes como secuencias de bytes.
bytes es una secuencia inmutable, lo que significa que no se puede cambiar su contenido después de crearlo. Esto es ideal cuando se necesita asegurar que los datos permanezcan sin cambios, como al leer un archivo o recibir un paquete de red.
bytearray es mutable, por lo que se puede modificar su contenido en el lugar. Utilice bytearray cuando sea necesario construir un mensaje, alterar partes de un búfer o manipular datos binarios de manera eficiente antes de enviarlos o guardarlos.
Cuándo usar cada uno:
- Usar
bytespara datos binarios fijos y de solo lectura, como el contenido de archivos o mensajes de red que no necesitan modificarse; - Usar
bytearraycuando sea necesario editar, agregar o modificar los datos binarios antes de su procesamiento o transmisión.
Conversión entre bytes y bytearray
Se puede convertir fácilmente entre objetos bytes (inmutables) y bytearray (mutables) en Python. Esto permite elegir el tipo adecuado según las necesidades—bytes para datos fijos, bytearray cuando se necesita modificar el contenido.
- Usar el constructor
bytes()para convertir unbytearrayen un objetobytesinmutable; - Usar el constructor
bytearray()para crear una copia mutable a partir de un objetobytes.
Esto es útil cuando se necesita editar datos binarios (usando bytearray), y luego fijarlos (usando bytes) para almacenamiento o transmisión segura.
raw = bytearray(b"data")
raw[0] = 68 # Change first byte to 'D'
locked = bytes(raw) # Convert to immutable bytes
b = b"example"
mutable = bytearray(b) # Convert to mutable bytearray
mutable.append(33) # Add '!' (ASCII 33)
Una vez convertido a bytes, no se puede cambiar el contenido. Utilice bytearray cuando sea necesario editar datos binarios antes de finalizarlos como bytes.
1234567891011# Convert bytes to bytearray b = b"hello" ba = bytearray(b) # Modify the bytearray (change 'h' to 'H') ba[0] = ord('H') print(ba) # bytearray(b'Hello') # Convert bytearray back to bytes b2 = bytes(ba) print(b2) # b'Hello'
123456try: b"ID:" + "123" except TypeError as e: print(e) ok = b"ID:" + "123".encode("utf-8")
Diferencias de longitud
Algunos caracteres ocupan un elemento de texto pero varios bytes, por lo que su longitud en str y en la forma codificada puede diferir. Esto ocurre porque codificaciones como UTF-8 pueden usar más de un byte para representar un solo carácter.
123ch = "é" len(ch) # 1 len(ch.encode()) # 2
Archivos
Los archivos binarios deben abrirse en modo "rb" para que sus bytes sin procesar se lean exactamente como están almacenados. Esto evita que Python intente interpretar los datos como texto.
# with open("example.png", "rb") as f:
# blob = f.read()
¡Gracias por tus comentarios!