Skip to content
Empieza gratis

¿Por qué se pierden los ceros a la izquierda de un CSV?

Entiende por qué los programas quitan los ceros de los códigos y aprende a leer códigos postales y claves como texto, en pandas, en DuckDB y en Excel.

Curso gratis. Tu Maestro, una IA, .

Contabilidad te manda clientes.csv para repartir los pedidos por zona. Lo abres con doble clic en Excel y el código postal del primer cliente dice 6700. La clave de su sucursal dice 1. ¿Te mandaron mal el archivo?

Ábrelo como texto, como en el módulo 1, y la duda se resuelve:

clientes.csv
cliente,codigo_postal,clave_sucursal,ventas
Abarrotes Doña Peña,06700,001,15230.50
Papelería La Única,44100,014,8920.00
Farmacia San José,45640,003,22105.75
Datos sintéticos, CC0. El archivo, visto como texto.

El 06700 está ahí, completo. Un CSV es texto, y el texto guarda cada carácter, ceros incluidos. Lo que se pierde no se pierde en el archivo: se pierde al leerlo, cuando el programa decide que esa columna son números. Y un número no tiene ceros a la izquierda: 06700 y 6700 son la misma cantidad.

Microsoft lo explica sin rodeos en su ayuda de Excel: "Excel elimina automáticamente los ceros a la izquierda y convierte los números grandes a notación científica [...] para permitir que las fórmulas y las operaciones matemáticas funcionen en ellos". Excel supone que, si algo parece número, vas a querer hacer cuentas con él.

Pero un código postal no es una cantidad. Nunca vas a sumar dos códigos postales ni a sacar el promedio de las claves de sucursal. Son etiquetas que solo usan dígitos. Lo mismo pasa con un número de cliente, un teléfono o un SKU como 00731.

La regla que vas a usar el resto del curso: si nunca lo sumarías, léelo como texto.

pandas cae en lo mismo que Excel. Predice qué pasa con el archivo de contabilidad:

pandas sin instrucciones

Ejemplo 1 de 4

example.py
import pandas as pd

with open("clientes.csv", "w", encoding="utf-8") as archivo:
    archivo.write("cliente,codigo_postal,clave_sucursal,ventas\nAbarrotes Doña Peña,06700,001,15230.50\nPapelería La Única,44100,014,8920.00\nFarmacia San José,45640,003,22105.75\n")

clientes = pd.read_csv("clientes.csv")
print(clientes.dtypes)
print(clientes.loc[0, "codigo_postal"], clientes.loc[0, "clave_sucursal"])

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

Lo importante de las cuatro corridas: el archivo era el mismo. Lo que cambió fue lo que cada lector supuso. pandas supuso números; DuckDB, en este caso, supuso texto. Ninguno de los dos te avisó de nada.

Por eso no te conviene depender de la suposición de nadie. Cuando una columna es un código, díselo al lector:

  • En pandas: dtype={"codigo_postal": str, "clave_sucursal": str}.
  • En DuckDB: read_csv('clientes.csv', types={'codigo_postal': 'VARCHAR', 'clave_sucursal': 'VARCHAR'}).

Las dos formas hacen lo mismo: leen esas columnas como texto y dejan que el resto se adivine. Pregúntale a tu Maestro cómo decidir qué columnas de tus archivos son códigos.

En Excel

En las versiones recientes de Excel puedes apagar esa conversión. Microsoft documenta una opción llamada Conversión automática de datos, que se aplica a Excel para Microsoft 365 y Excel 2024, en Windows y en Mac. Dónde está depende de tu sistema:

  1. En la pestaña Archivo, elige Opciones.
  2. Selecciona la pestaña Datos y ve a Conversión automática de datos.
  3. Deshabilita Eliminar los ceros a la izquierda y convertir a número.

Desde ese momento, 00123 se queda como 00123, guardado como texto.

  1. Selecciona Excel y elige Preferencias.
  2. Selecciona la pestaña Editar y ve a Conversión automática de datos.
  3. Deshabilita Eliminar los ceros a la izquierda y convertir a número.

Desde ese momento, 00123 se queda como 00123, guardado como texto.

Dos avisos de la misma ayuda de Microsoft. Primero, esa opción no toca lo que importas con Power Query, que tiene su propia manera de decir el tipo de cada columna; la ves en el módulo 4. Segundo, un número guardado como texto puede no servir para operaciones matemáticas. Para un código postal eso da igual: nunca lo vas a sumar.

Si tu Excel no tiene esa opción o no quieres cambiarla, en el módulo 4 aprendes a importar el archivo indicando, columna por columna, cuáles son texto.

Error común: Darle formato después no devuelve los ceros

Una salida común es aplicar a la columna un formato personalizado como 00000. Microsoft advierte que eso "no restaurará los ceros iniciales que se quitaron antes de aplicar el formato". Y si guardas el CSV desde Excel después de que quitó los ceros, el archivo nuevo ya no los trae. Si necesitas el original, vuelve a pedirlo o conserva una copia sin tocar.

Inténtalo

Este programa asigna a cada cliente su zona de reparto y su sucursal, buscando el código postal y la clave en dos diccionarios. Córrelo: todas las zonas salen NaN, que en pandas quiere decir "no encontré nada".

Fíjate en un detalle antes de arreglarlo: tampoco encuentra la zona de 44100, que no tiene ningún cero. El problema no es solo el cero perdido. El número 44100 y el texto "44100" no son lo mismo para Python, y las claves del diccionario son texto. Si no ves por qué falla también 44100, pregúntale a tu Maestro.

Corre el programa: zona y sucursal salen NaN. Cambia solo la línea de pd.readcsv para que codigopostal y clavesucursal se lean como texto. Ya quedó cuando cada cliente tiene su zona y su sucursal, y las ventas totales siguen siendo 46256.25.

Corre el programa: zona y sucursal salen NaN. Cambia solo la línea de pd.read_csv para que codigo_postal y clave_sucursal se lean como texto. Ya quedó cuando cada cliente tiene su zona y su sucursal, y las ventas totales siguen siendo 46256.25.

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ú

Comprueba lo que sabes: Te llega un archivo con estas cuatro columnas. ¿Cuál conviene leer como número?