¿Cómo leo bien en pandas un archivo que viene de otro país?
Lee paso a paso la lista de precios de Valencia con separador, decimales, miles y codificación explícitos, y calcula el valor del inventario.
Curso gratis. Tu Maestro, una IA, .
Ya tienes las piezas: el separador, la marca decimal, los miles y el BOM. Ahora junta todo en una sola lectura. La versión completa de la lista de precios de Valencia trae cinco productos, y uno cuesta más de mil:
sku;descripcion;precio;existencias
00731;Cuaderno profesional;23,50;380
01204;Plumas azules (caja);118,00;64
00090;Goma blanca;9,90;1200
09810;Mochila escolar;1.180,00;15
00412;Lápiz adhesivo;14,75;540Y empieza con un BOM, que no se ve aquí pero está en los primeros tres bytes. Tu jefa quiere saber cuánto vale el inventario del proveedor: precio por existencias, sumado. Antes de escribir código, así lo resolvería alguien con experiencia. Intenta cada paso antes de abrirlo.
Leer la lista de precios de Valencia
Ejemplo resuelto · 5 pasos
El archivo datos/lista_precios.csv usa punto y coma, coma decimal, punto de miles y BOM. Hay que leerlo en pandas de modo que precio y existencias sean números y se puedan multiplicar.
Piensa el siguiente paso por tu cuenta y luego ábrelo para comparar.
Inténtalo
El script inventario.py lee la lista sin ninguna opción y falla. Agrégale a pd.read_csv lo que necesita y córrelo con uv run inventario.py. Hazlo de a una opción y vuelve a correr cada vez: ver cómo cambia el error también enseña. Si el error cambia y no sabes qué te está diciendo, pégaselo a tu Maestro.
Tu turno
Corre uv run inventario.py y lee el error. Agrega a pd.read_csv el separador, la marca decimal, el separador de miles y la codificación que usa datos/lista_precios.csv. Ya quedó cuando imprime las cuatro columnas y Valor del inventario: $54,027.00.
- datos
Enter ejecuta · ↑ ↓ historial · → acepta · helpCtrl+Enter ejecuta · Tab sangra · Esc y luego Tab sale · Ctrl+` terminal
Lo que pasa a medio camino
Si agregaste sep=";" y decimal="," pero todavía no thousands=".", el error que viste no habla de comas ni de miles. Dice algo como ValueError: Unknown format code 'f' for object of type 'str', en la última línea. Vale la pena entender por qué, porque es una trampa que aparece mucho.
Como 1.180,00 no es un número válido para pandas sin thousands, toda la columna precio se queda como texto. Y en Python, texto por número no es un error: es repetir el texto. "1.180,00" * 15 da 1.180,001.180,00... quince veces seguidas. Lo corrimos en la caja de arena: la columna valor de la mochila queda como un texto de 120 caracteres. La multiplicación "funcionó", la suma pegó todos esos textos en uno, y el programa solo se quejó al final, cuando le pediste darle formato de dinero a un texto.
La lección no es memorizar ese mensaje. Es esta: un error al final del script puede venir de una lectura mal hecha al principio. Por eso el último paso del ejemplo resuelto era revisar dtypes antes de calcular. Si precio dice str, no sigas: vuelve a read_csv.
Una sola celda basta para que pase. Las otras cuatro filas de la lista se leerían bien con decimal=","; es la mochila, la única que pasa de mil, la que deja toda la columna como texto. En tus archivos del trabajo suele ser igual: el problema está en la fila que no revisaste.
Pídele a tu Maestro que te ayude a encontrar qué fila deja una columna como texto.
Fíjate en lo que no hiciste: no abriste el archivo para reemplazar comas por puntos, ni le pediste al proveedor que lo mandara distinto. El archivo está bien; le dijiste a pandas cómo leerlo. Si mañana llega la lista de octubre, el mismo script la lee igual.
Una línea de pd.read_csv con sus opciones a la vista es también documentación: quien lea tu script después sabe, sin abrir el archivo, que viene con punto y coma, comas decimales y BOM. Pregúntale a tu Maestro qué otras opciones de read_csv te pueden servir con tus archivos.