CSV permite intercambiar tablas con herramientas muy distintas. Su sencillez aparente puede llevarte a dividir líneas por comas y perder datos. Hoy utilizarás el módulo csv para leer y escribir registros con nombres de columnas. Definiremos un formato concreto que después empleará la aplicación final.
Acordar el formato antes de leerlo
Nuestro CSV tendrá tres columnas en este orden: codigo, nombre y cantidad. Utilizará punto y coma como separador y UTF-8 como codificación. La primera línea contendrá la cabecera. Las cantidades aparecerán como enteros no negativos escritos en texto. Estos acuerdos forman parte del formato, no son detalles que el lector deba adivinar.
Un archivo CSV no tiene un único separador universal. Algunas aplicaciones utilizan comas y otras punto y coma. Tampoco una extensión garantiza cómo se ha exportado. Cuando recibas un documento comprueba la configuración de origen. En este curso rechazaremos cabeceras distintas para detectar rápidamente un archivo que no cumple el contrato.
from pathlib import Path
ruta = Path("articulos_demo.csv") campos = ["codigo", "nombre", "cantidad"] registros = [ {"codigo": "CU001", "nombre": "Cuaderno", "cantidad": 3}, {"codigo": "CA001", "nombre": "Carpeta; azul", "cantidad": 2}, ]
with ruta.open("x", encoding="utf-8", newline="") as archivo: escritor = csv.DictWriter(archivo, fieldnames=campos, delimiter=";") escritor.writeheader() escritor.writerows(registros) «`
Ejecuta el ejemplo sobre un nombre que todavía no exista. El escritor se ocupa de entrecomillar el nombre que contiene un punto y coma. Si dividieras esa línea con split(";") interpretarías ese separador interior como otra columna. El módulo conoce las reglas de comillas y conserva el nombre como un único campo.
Leer por nombres de columna
DictReader utiliza la cabecera para construir diccionarios. Sus valores siguen siendo cadenas. La escritura «3» no se convierte automáticamente en el entero 3. Esta distinción permite separar la lectura estructural de la validación de cada campo. El próximo capítulo reunirá ambos pasos de forma controlada.
with ruta.open("r", encoding="utf-8", newline="") as archivo:
lector = csv.DictReader(archivo, delimiter=";")
if lector.fieldnames != campos:
raise ValueError("Cabecera incorrecta")
for fila in lector:
print(fila["nombre"], repr(fila["cantidad"]))
repr ayuda a observar que la cantidad es texto. Si sumaras dos cantidades sin convertirlas podrías concatenar cadenas en lugar de calcular unidades. No modifiques el lector para convertir indiscriminadamente todos los valores: los códigos también pueden contener dígitos y deben seguir siendo texto.
Por qué aparece newline vacío
El módulo csv necesita gestionar los saltos de línea del formato. Al abrir con newline="" evitas que la capa de texto realice transformaciones que interfieran con ese trabajo. Es una convención importante tanto al leer como al escribir. Mantén también la codificación explícita para que tildes y eñes no dependan del equipo.
Algunos programas añaden una marca inicial UTF-8 conocida como BOM. Nuestro lector final utilizará utf-8-sig para aceptar tanto archivos UTF-8 ordinarios como archivos con esa marca. No significa que acepte cualquier codificación. Si el documento procede de otro formato debes exportar una copia con la configuración acordada.
Un ciclo completo de ida y vuelta
Una comprobación útil consiste en escribir registros, leer el archivo resultante y comparar los datos. Debes tener en cuenta que las cantidades vuelven como texto hasta validarlas. El objetivo no es que el archivo se vea bonito en el editor sino que conserve exactamente los campos significativos al cruzar la frontera entre memoria y disco.
Incluye nombres con espacios, tildes y un separador interior. Son casos pequeños que detectan errores de implementación. También puedes probar comillas dentro de un nombre. El escritor debe escaparlas según las reglas CSV. No prepares manualmente cadenas con separadores si ya tienes una herramienta que conoce esas reglas.
Abrir el CSV en una hoja de cálculo
Una hoja de cálculo puede interpretar datos al abrirlos. Algunos códigos con ceros iniciales podrían convertirse en números y perder esos ceros. Por eso nuestros códigos combinan letras y dígitos en los ejemplos, aunque el validador permita otras combinaciones. Si necesitas conservar códigos numéricos configura su columna como texto al importar en esa aplicación.
También debes tener cuidado con campos que una hoja de cálculo interpreta como fórmulas. El proyecto rechazará nombres que empiecen por determinados caracteres de fórmula después de quitar espacios exteriores. Es una protección básica del formato educativo, no una garantía universal para todas las hojas de cálculo. Al importar datos externos revisa sus opciones y conserva una copia original.
Errores habituales
La cabecera es sensible a los nombres elegidos. Codigo con mayúscula no es la clave codigo que espera el programa. Podemos decidir aceptar variantes pero eso requeriría una normalización explícita. Aquí preferimos un contrato estricto para que un error se detecte al comienzo y no aparezca más tarde como una clave inexistente.
Otro problema son filas con más o menos campos de los previstos. DictReader puede representarlas sin detenerse inmediatamente. No basta con que el lector produzca un diccionario: tienes que comprobar la forma del registro. Esa será una responsabilidad central de la importación. Un documento que se puede leer no es necesariamente un documento válido.
Una comprobación adicional
Antes de enviar un archivo a otra persona comprueba también que has escrito la cabecera una sola vez. Añadir nuevas exportaciones al final de un CSV existente puede introducir cabeceras intermedias que después se interpretarían como datos. La creación de una salida nueva evita esa mezcla en nuestras prácticas.
Lo que deberías recordar
- CSV requiere un formato acordado.
- DictReader devuelve valores de texto.
- No dividas las líneas con split.
- Valida también columnas y estructura de cada fila.
Ejercicio práctico
Genera articulos_demo.csv y ábrelo como texto. Localiza el nombre que contiene punto y coma y observa cómo queda entrecomillado. Léelo con DictReader y comprueba que vuelve a aparecer como un único nombre. Anota el tipo que tiene la cantidad después de la lectura.
Añade un tercer registro con un nombre que contenga una tilde y comillas. Escribe una nueva salida con otro nombre de archivo para conservar la primera. Comprueba el ciclo de escritura y lectura sin utilizar split. Si abres el documento con una hoja de cálculo revisa manualmente el separador elegido.
Crea una copia del CSV y cambia su cabecera. La comprobación debe rechazarla. En el cuaderno redacta el contrato del formato en una sola lista: columnas, orden, separador, codificación y significado de cantidad. Esa lista será la referencia de las próximas importaciones.
Referencia de consulta: Módulo csv en la documentación oficial de Python.
Siguiente: Validar una importación antes de guardar.








