Saltar a contenido

Ficheros binarios

¿Cuándo usar el modo binario?

Los ficheros de texto almacenan datos como secuencias de caracteres con una codificación determinada (UTF-8, Latin-1...). Los ficheros binarios almacenan datos como secuencias de bytes sin ninguna interpretación de caracteres.

Se usa el modo binario cuando:

  • El fichero contiene datos que no son texto: imágenes, audio, vídeo, PDFs, ejecutables, archivos ZIP...
  • Se necesita un control exacto byte a byte del contenido
  • Se trabaja con formatos binarios propietarios

Los modos de apertura para ficheros binarios son:

Modo Descripción
"rb" Lectura binaria
"wb" Escritura binaria (sobreescribe)
"ab" Escritura binaria al final (append)
"rb+" Lectura y escritura binaria

En modo binario Python no aplica ninguna conversión de codificación. Lo que se lee o escribe son bytes puros (bytes), no strings.

Diferencia entre modo texto y modo binario

# Modo texto: devuelve str
with open("notas.txt", "r", encoding="utf-8") as f:
    datos = f.read()
print(type(datos))   # <class 'str'>

# Modo binario: devuelve bytes
with open("notas.txt", "rb") as f:
    datos = f.read()
print(type(datos))   # <class 'bytes'>
print(datos[:20])    # b'Ana Garc\xc3\xada: 8.5\n'

En modo texto, Python convierte los bytes del fichero a caracteres usando el encoding. En modo binario, devuelve los bytes sin convertir.

Ejemplo: copiar un fichero binario

La operación más habitual con ficheros binarios es copiarlos sin alterar su contenido. Esto funciona con cualquier tipo de fichero (imagen, PDF, ZIP...) porque no se interpreta el contenido:

1
2
3
4
5
6
7
8
def copiar_fichero(origen, destino):
    """Copia cualquier fichero byte a byte."""
    with open(origen, "rb") as f_origen:
        with open(destino, "wb") as f_destino:
            f_destino.write(f_origen.read())


copiar_fichero("foto_alumno.jpg", "foto_alumno_backup.jpg")

Para ficheros grandes, es mejor leer y escribir en bloques (chunks) en lugar de cargar todo en memoria:

1
2
3
4
5
6
7
8
9
def copiar_fichero_grande(origen, destino, tam_bloque=65536):
    """Copia un fichero en bloques de 64 KB."""
    with open(origen, "rb") as f_origen:
        with open(destino, "wb") as f_destino:
            while bloque := f_origen.read(tam_bloque):
                f_destino.write(bloque)


copiar_fichero_grande("video.mp4", "video_backup.mp4")

El operador morsa := (Python 3.8+) asigna el valor devuelto por read() a bloque y evalúa la condición al mismo tiempo. Cuando read() devuelve b"" (bytes vacíos) al llegar al final del fichero, el bucle termina.

Leer y escribir bytes directamente

Los objetos bytes y bytearray son los tipos de datos para trabajar con datos binarios en Python:

1
2
3
4
5
6
7
8
9
# Escribir bytes directamente
with open("datos.bin", "wb") as f:
    f.write(b"\x00\x01\x02\x03\xFF")   # 5 bytes

# Leer bytes
with open("datos.bin", "rb") as f:
    datos = f.read()
print(datos)          # b'\x00\x01\x02\x03\xff'
print(len(datos))     # 5

Contexto: librerías especializadas

Para los formatos binarios más comunes, Python dispone de librerías que abstraen la complejidad del formato y permiten trabajar a un nivel más alto:

Formato Librería
Imágenes (PNG, JPG, BMP...) Pillow (PIL)
PDFs PyPDF2, pdfplumber
Excel (.xlsx) openpyxl, pandas
Audio wave (WAV), mutagen
Archivos ZIP zipfile (incluido en stdlib)
import zipfile

# Crear un ZIP con varios ficheros
with zipfile.ZipFile("exportacion.zip", "w") as zf:
    zf.write("alumnos.csv")
    zf.write("alumnos.json")

# Extraer un ZIP
with zipfile.ZipFile("exportacion.zip", "r") as zf:
    zf.extractall("carpeta_destino/")

En este módulo trabajaremos principalmente con ficheros de texto

Los ficheros binarios son una capacidad importante de Python, pero para el desarrollo de aplicaciones de gestión de datos los formatos más usados son texto, CSV y JSON. Las librerías especializadas (Pillow, openpyxl, etc.) se estudian en módulos más avanzados.