4.4 CSV en python

4.4.1 La librería csv

La librería csv viene incluida en Python, por lo que no requiere instalación.

4.4.1.1 Leer un CSV con csv.reader()

import csv

with open("datos.csv", newline='', encoding="utf-8") as f:
    reader = csv.reader(f)
    for fila in reader:
        print(fila)

4.4.1.2 Leer un CSV con cabeceras: csv.DictReader()

import csv

with open("datos.csv", newline='', encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for fila in reader:
        print(fila["Nombre"], fila["Edad"])

4.4.1.3 Escribir un CSV con csv.writer()

import csv

datos = [
    ["Nombre", "Edad"],
    ["Ana", 40],
    ["Diego", 41]
]

with open("salida.csv", "w", newline='', encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(datos)
```*

#### Escribir un CSV con cabeceras: `csv.DictWriter()`

```python
import csv

personas = [
    {"Nombre": "Ana", "Edad": 40},
    {"Nombre": "Diego", "Edad": 41}
]

with open("salida.csv", "w", newline='', encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["Nombre", "Edad"])
    writer.writeheader()
    writer.writerows(personas)

4.4.2 Trabajar con CSV usando pandas

pandas es la librería más potente para análisis de datos en Python.

4.4.2.1 Leer un CSV

import pandas as pd

df = pd.read_csv("datos.csv")
print(df.head())

4.4.2.2 Guardar un CSV

df.to_csv("salida.csv", index=False)

4.4.2.3 Operaciones básicas

df["Nombre"]                # Acceder a una columna
df["Edad"].mean()           # Media de una columna numérica
df[df["Edad"] > 30]         # Filtrar filas

4.4.3 Insertar datos en SQLite a partir de CSV

with open('venues.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        cursor.execute('''
            INSERT INTO Venue (Name, Capacity, Street, Number, City)
            VALUES (?, ?, ?, ?, ?)
        ''', (row['Name'], row['Capacity'], row['Street'], row['Number'], row['City']))

A menudo un CSV contiene nombres en vez de IDs, por ejemplo:

with open("concerts.csv") as f:
    reader = csv.DictReader(f)

    for row in reader:
        venue_name = row["Venue"].strip()

        # Buscar VenueId
        cur.execute("SELECT VenueId FROM Venue WHERE Name = ?", (venue_name,))
        result = cur.fetchone()

        if result is None:
            print("ERROR: No existe el Venue:", venue_name)
            continue

        venue_id = result[0]

        # Insertar en la tabla Concert
        cur.execute("""
            INSERT INTO Concert (ConcertId, VenueId, Name, Tickets, TicketsSold, Date)
            VALUES (?, ?, ?, ?, ?, ?)
        """, (
            int(row["ConcertId"]),
            venue_id,
            row["Name"],
            int(row["Tickets"]),
            int(row["TicketsSold"]),
            row["Date"]
        ))