Curso de Python / Leer y escribir archivos CSV
CSV, un formato de valores separados por comas, guarda filas y campos como texto. Utiliza el módulo csv para interpretar delimitadores y comillas, y valida después los campos numéricos: DictReader normalmente entrega sus valores como cadenas.
Interpretar CSV en lugar de dividir por comas
Un campo entrecomillado puede contener comas o saltos de línea. split(",") no interpreta esas reglas. DictReader utiliza la cabecera para construir cada diccionario, pero el programa debe decidir cómo gestionar nombres duplicados y cantidades de campos inesperadas.
Abre los CSV con newline="" para que el módulo gestione los saltos de línea. Al leer UTF-8, utf-8-sig acepta una marca inicial de orden de bytes, o BOM, que algunas herramientas añaden y que, de otro modo, podría aparecer dentro del nombre de la primera columna.
La referencia oficial del módulo csv describe las convenciones de lectura, escritura y dialectos.
Guardar un nombre con coma y calcular el total
El siguiente programa reemplaza expenses-demo.csv. Utiliza una carpeta de práctica desechable y guarda el script como csv_demo.py en UTF-8. Ejecuta python csv_demo.py con el entorno del proyecto seleccionado; fuera del entorno en macOS o Ubuntu, utiliza python3 si corresponde.
import csv
from pathlib import Path
path = Path("expenses-demo.csv")
with path.open("w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["name", "amount"])
writer.writeheader()
writer.writerows([{ "name": "lunch, team", "amount": 8000}, {"name": "bus", "amount": 2500}])
total = 0
with path.open(encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
if reader.fieldnames != ["name", "amount"]:
raise ValueError("unexpected header")
for row in reader:
total += int(row["amount"])
print(row["name"])
print("total:", total)
La salida esperada es:
lunch, team
bus
total: 10500
lunch, team sigue siendo un único nombre aunque contenga una coma. Abre el archivo generado para ver las comillas y léelo de nuevo con el módulo csv: comprueba tanto los valores como la cantidad de columnas.
Definir la validación de filas e importes
Una cadena vacía, un número con separadores de miles y una cantidad con una etiqueta de moneda no pueden pasarse indiscriminadamente a int(). Define las representaciones aceptadas y cómo comunicar errores antes de quitar caracteres. Una limpieza excesiva puede convertir una entrada incorrecta en algo que parece válido.
El ejemplo verifica exactamente los nombres y el orden de la cabecera antes de sumar. Cada importe se convierte a entero de forma explícita. Comprobar la estructura del archivo y validar las reglas del importe son tareas relacionadas, pero distintas.
enumerate(reader, start=2) puede numerar los registros lógicos posteriores a la cabecera. Si un campo entrecomillado contiene un salto de línea, ese número no coincide necesariamente con una línea física del archivo. Indica qué clase de posición identifica tu informe de errores.
Comprobar repeticiones y exportaciones
- Confirma que lunch, team ocupa un solo campo y que su fila tiene dos columnas.
- Cambia únicamente la cabecera esperada por la comprobación, sustituyendo amount por cost, y observa que el programa rechaza el archivo.
- Restaura la cabecera esperada y ejecuta de nuevo: el modo w reemplaza el ejemplo, sin añadir indefinidamente nuevas filas.
CSV no impone tipos de campos ni las reglas de interpretación de una hoja de cálculo. Algunas aplicaciones interpretan valores externos que empiezan con = como fórmulas. Las comillas de CSV no resuelven por sí solas esa interpretación: una exportación compartida debe aplicar validación y tratamiento de texto apropiados para la aplicación receptora.
El proyecto de validación de CSV y generación de informes amplía esta práctica con un informe de registros aceptados y rechazados, sin confundir lectura correcta del formato con validez de los datos.




