python CSV file dati libreria-standard

La Libreria CSV in Python

La libreria csv di Python fornisce funzionalità per lavorare con file CSV (Comma Separated Values), permettendo di leggere, scrivere e manipolare dati tabulari in modo semplice ed efficace.

La libreria è inclusa nella libreria standard di Python: non è necessario installare nulla.

import csv

Gli esempi di questa guida utilizzano un file studenti.csv con le colonne: matricola, cognome, nome, esame, voto.


Lettura con csv.reader

csv.reader restituisce un iteratore che fornisce una lista per ogni riga del file.

import csv

with open('studenti.csv', mode='r', newline='') as file:
    lettore_csv = csv.reader(file)
    intestazione = next(lettore_csv)  # salta l'intestazione
    for riga in lettore_csv:
        print(riga)
        # riga è una lista: ['12345', 'Rossi', 'Mario', 'Matematica', '28']
  • next(lettore_csv) legge e scarta la prima riga (intestazione)
  • Ogni riga successiva viene restituita come lista di stringhe

Scrittura con csv.writer

csv.writer permette di scrivere righe in un file CSV.

import csv

dati_studenti = [
    ['12345', 'Rossi',   'Mario', 'Matematica', '28'],
    ['67890', 'Bianchi', 'Luca',  'Fisica',     '30'],
    ['54321', 'Verdi',   'Anna',  'Chimica',    '27'],
]

with open('studenti_scritti.csv', mode='w', newline='') as file:
    scrittore_csv = csv.writer(file)
    scrittore_csv.writerow(['matricola', 'cognome', 'nome', 'esame', 'voto'])
    scrittore_csv.writerows(dati_studenti)
MetodoDescrizione
writerow(lista)Scrive una singola riga
writerows(lista_di_liste)Scrive più righe in un’unica chiamata

Lettura come dizionario con DictReader

DictReader legge ogni riga come un dizionario, usando la prima riga del file come chiavi.

import csv

with open('studenti.csv', mode='r', newline='') as file:
    lettore_csv = csv.DictReader(file)
    for riga in lettore_csv:
        print(riga['matricola'], riga['cognome'], riga['nome'],
              riga['esame'], riga['voto'])

Ogni riga è un dizionario del tipo:

{'matricola': '12345', 'cognome': 'Rossi', 'nome': 'Mario', 'esame': 'Matematica', 'voto': '28'}

Leggere un CSV senza intestazione

Se il file non ha un’intestazione, si specificano manualmente i nomi delle colonne con fieldnames:

import csv

campi = ['matricola', 'cognome', 'nome', 'esame', 'voto']

with open('studenti_senza_intestazione.csv', mode='r', newline='') as file:
    lettore_csv = csv.DictReader(file, fieldnames=campi)
    for riga in lettore_csv:
        print(riga['matricola'], riga['cognome'], riga['nome'])

Scrittura da dizionario con DictWriter

DictWriter scrive righe a partire da dizionari.

import csv

dati_studenti = [
    {'matricola': '12345', 'cognome': 'Rossi',   'nome': 'Mario', 'esame': 'Matematica', 'voto': '28'},
    {'matricola': '67890', 'cognome': 'Bianchi', 'nome': 'Luca',  'esame': 'Fisica',     'voto': '30'},
    {'matricola': '54321', 'cognome': 'Verdi',   'nome': 'Anna',  'esame': 'Chimica',    'voto': '27'},
]

campi = ['matricola', 'cognome', 'nome', 'esame', 'voto']

with open('studenti_scritti_dict.csv', mode='w', newline='') as file:
    scrittore_csv = csv.DictWriter(file, fieldnames=campi)
    scrittore_csv.writeheader()       # scrive la riga di intestazione
    scrittore_csv.writerows(dati_studenti)

Riepilogo classi e metodi

Classe / FunzioneUsoTipo di dato
csv.reader(file)Lettura riga per rigaLista per riga
csv.writer(file)Scrittura riga per rigaLista per riga
csv.DictReader(file)Lettura con chiavi colonnaDizionario per riga
csv.DictWriter(file, fieldnames)Scrittura da dizionariDizionario per riga

Metodi writer

MetodoDescrizione
writerow(row)Scrive una riga (lista o dizionario)
writerows(rows)Scrive più righe
writeheader()Scrive la riga di intestazione (DictWriter)

Note pratiche

  • Usare sempre newline='' nell’apertura del file per evitare righe vuote su Windows.
  • La modalità 'w' sovrascrive il file; usare 'a' per aggiungere in coda.
  • I valori sono sempre stringhe: convertire esplicitamente con int() o float() se necessario.
for riga in lettore_csv:
    voto = int(riga['voto'])
    print(f"{riga['nome']} {riga['cognome']}: {voto}/30")