Skip to content
Empieza gratis

¿Qué es el BOM y por qué mi primera columna trae letras de más?

Conoce los tres bytes invisibles al inicio de algunos archivos UTF-8: a Excel le ayudan, a tu script le estorban. Aprende a leerlos sin que se cuelen.

Curso gratis. Tu Maestro, una IA, .

En la primera práctica del curso, la de ver.py, viste que la lista de precios empezaba raro: su primer campo no era sku sino '\ufeffsku'. Ese carácter extra, invisible, es el BOM (del inglés byte order mark). En un archivo UTF-8 son tres bytes al principio, EF BB BF, antes de la primera letra. No es un dato: es una marca que dice "esto es UTF-8".

Recuerda que un archivo no anuncia su codificación. El BOM es lo más parecido a un anuncio, y por eso a Excel le importa. Microsoft lo dice en su ayuda: un CSV en UTF-8 se abre normalmente "si se guardó con BOM"; si no, hay que importarlo indicándole la codificación. Y en Power Query, la herramienta de importar datos de Excel, documenta que "UTF-8 solo se infiere si comienza con una BOM de UTF-8".

Así que el BOM tiene dos caras. Para Excel es una ayuda: sin él, tu archivo bien hecho en UTF-8 puede abrirse con à en los acentos al hacer doble clic. Para otros programas es un carácter de más que se cuela en el nombre de la primera columna. Predice:

El archivo de cada programa se crea con un BOM al inicio (utf-8-sig lo escribe así). Luego se lee de distintas formas.

El archivo de cada programa se crea con un BOM al inicio (utf-8-sig lo escribe así). Luego se lee de distintas formas.

El módulo csv de Python, con utf-8

Ejemplo 1 de 4

example.py
import csv

with open("precios.csv", "w", encoding="utf-8-sig") as archivo:
    archivo.write("sku,precio\n00731,23.50\n")

with open("precios.csv", encoding="utf-8") as archivo:
    fila = next(csv.DictReader(archivo))

print(fila)
print(fila["sku"])

Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.

Ejemplo 2 de 4, se abre cuando expliques este

Haz tu predicción

Un carácter que no se ve, pero cuenta

Por eso el BOM desconcierta: con BOM y sin BOM, el nombre sku se ve igual en pantalla, y aun así Python los trata como nombres distintos. Hay dos maneras de cazarlo que no dependen de tus ojos: leer los primeros bytes del archivo en modo binario ("rb") y pedirle a Python el repr del nombre, que escribe los caracteres invisibles. Esto imprimió un programa corrido en la caja de arena:

Python
with open("precios.csv", "w", encoding="utf-8-sig") as archivo:
    archivo.write("sku,precio\n00731,23.50\n")

with open("precios.csv", "rb") as archivo:
    print(archivo.read(3))

with open("precios.csv", encoding="utf-8") as archivo:
    primera = archivo.readline().split(",")[0]

print(len(primera), "caracteres")
print(repr(primera))
Salida
b'\xef\xbb\xbf'4 caracteres'\ufeffsku'
El mismo archivo: tres bytes al inicio y, en lo que parece sku, cuatro caracteres.Ejecutado el 17 de octubre de 2026 por Maestro sandbox run (check_exercise_code).

Lo que parece sku tiene 4 caracteres, no 3, y repr lo delata: \ufeffsku. Si un KeyError dice que una columna no existe y tú la ves ahí, imprime repr(nombre) antes de buscar otra causa. Pide a tu Maestro que te ayude a revisar si un archivo tuyo empieza con BOM.

La regla práctica en Python: cuando leas un CSV que puede venir de Excel o de otro sistema, usa encoding="utf-8-sig". Lee igual un archivo con BOM y uno sin él, así que no pierdes nada. En pandas no hace falta para el BOM, pero escribirlo deja claro qué esperas.

Y cuando el problema es al revés, cuando tú escribes un archivo para alguien que lo va a abrir con doble clic en Excel, el BOM juega a tu favor: lo ves en el módulo 4, en la página de exportar.

¿Tienes un script que falla con KeyError en la primera columna? Cuéntale a tu Maestro. Lo primero que va a preguntarte es con qué encoding abres el archivo.

Inténtalo

Este script suma el inventario de la lista de precios con el módulo csv. Córrelo: falla. Arréglalo cambiando una sola cosa.

Corre el programa y lee el error. Cambia solo la codificación con que se lee el archivo (no la línea que lo crea, que imita cómo llega). Ya quedó cuando imprime las piezas de cada producto y el total: 1644 piezas.

Corre el programa y lee el error. Cambia solo la codificación con que se lee el archivo (no la línea que lo crea, que imita cómo llega). Ya quedó cuando imprime las piezas de cada producto y el total: 1644 piezas.

Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo.

Listo para ejecutar tu código.

Ejecuta tu código para ver su salida aquí.

Ejecútalo tú

Consejo: Tres formas de ver el mismo BOM

Como bytes: EF BB BF, o b'\xef\xbb\xbf' en Python. Leído con UTF-8 sin quitarlo: un carácter invisible, \ufeff en Python, pegado al primer nombre. Leído con Windows-1252: tres letras raras, con una ï al principio y una ¿ al final. Las tres son la misma marca.

Comprueba lo que sabes: Un compañero te dice: "el BOM es basura, hay que borrárselo a todos los archivos". ¿Qué le contestas?