6. Come Leggere File CSV

In questa lezione spiegheremo come fare a leggere file CSV tramite Python.

L'acronimo CSV sta per Comma Separated Values: si tratta di una delle estensioni più utilizzate soprattutto in ambito scientifico o quando si ha comunque a che fare con grosse quantità di dati. Si tratta di tabulati stile foglio di calcolo e per questo motivo vi sarà probabilmente capitato di lavorarci su Excel o Calc. Nel sito italiano dedicato agli open-data è possibile scaricare i vari database anche e spesso proprio in questo formato.

Per questa lezione ho appositamente scaricato il database dei monumenti italiani, quindi lavoreremo proprio con uno di questi file CSV, un database contenente dati sui vari monumenti della nostra nazione.

Per quanto la traduzione letterale del nome sia "Valori Separati Da Virgole", si tratta di un formato un po' bizzarro, in quanto il carattere delimitatore può essere sia una virgola o un punto e virgola o un altro carattere:

Ad esempio, creiamo un file di testo e inseriamo i seguenti dati:

1,mattino,colazione
2,pomeriggio,pranzo
3,sera,cena

Se salviamo i dati con estensione CSV, il file potrà essere interpretato anche da CALC proprio come un tabulato, in cui i valori sono stati separati appunto da virgole. Volendo avremmo potuto utilizzare ad esempio dei punti e virgola o dei trattini, o dei TAB.

Non tutti i file CSV saranno quindi necessariamente uguali, ma fintanto che hanno quest'estensione, potete lavorarci su Python: facciamo questo tramite un modulo apposito che ci viene fornito dalla Standard Library, il modulo CSV. Anzitutto dobbiamo aprire il nostro file, e facciamo questo con la funzione open():

import csv

with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-1") as filecsv:

Abbiamo quindi il percorso del nostro file, specifichiamo il carattere newline come una stringa vuota, e poi ho aggiunto anche la codifica dei caratteri con encoding="ISO-8859-1": quest'ultimo parametro potrebbe non essere necessario a seconda del file e del sistema con cui state lavorando, io l'ho aggiunto per aggirare un errore che mi veniva restituito dalla console.


Il metodo reader()

Ora che abbiamo il nostro bel file sotto tiro, possiamo finalmente iniziare ad utilizzare il modulo CSV. Per leggerlo utilizziamo il modulo reader() che restituisce un oggetto di tipo reader, ovvero lettore, che cicla per tutte le righe del nostro file CSV.

Al metodo reader() passiamo due parametri: il file da leggere e il delimitatore delle colonne del file:

import csv

with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-1") as filecsv:
    lettore = csv.reader(filecsv,delimiter=";")
    print(lettore)

# output
<_csv.reader object at 0x7f1a5fe10198>

Ora possiamo iniziare a fare tutto ció che vogliamo col nostro file. Vediamo un pó da cosa è composto l'header, ovvero la prima riga del nostro file:

import csv

with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-1") as filecsv:
    lettore = csv.reader(filecsv,delimiter=";")
    header = next(lettore)
    print(header)

# output
['Longitudine', 'Provincia', 'Comune', 'Tipo', 'gid', 'Anno inserimento', 'Nome', 'Latitudine', 'Identificatore in OpenStreetMap', 'Data e ora inserimento', 'Regione', '']

Come vedrete si tratta semplicemente di una lista di stringhe: ciascuna stringa rappresenta quindi una colonna della nostra tabella.

Supponiamo di voler ottenere l'elenco di tutti i monumenti presenti nella regione Toscana, e le corrispondenti coordinate, così da poter poi controllare istantaneamente la posizione su Google Maps.

Possiamo isolare le varie colonne che ci servono tramite il sistema di indicizzazione delle liste: possiamo creare quindi una sottolista d'interesse a partire da questi colonne, molto semplicemente:

import csv
with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-1") as filecsv:
    lettore = csv.reader(filecsv,delimiter=";")
    # header = next(lettore)
    # print(header)
    dati = [(linea[10],linea[6],linea[7],linea[0]) for linea in lettore if linea[10]=="Toscana" and linea[6] != ""]

E una volta che abbiamo la nostra sottolista, possiamo utilizzare un pó di formattazione per rendere i dati più human friendly:

import csv

with open("./mappa_monumenti_italia.csv", newline="", encoding="ISO-8859-1") as filecsv:
    lettore = csv.reader(filecsv,delimiter=";")
    # header = next(lettore)
    # print(header)
    dati = [(linea[10],linea[6],linea[7],linea[0]) for linea in lettore if linea[10]=="Toscana" and linea[6] != ""]
    for monumento in dati:
        print (f"{monumento[:2]} -- Coordinate: {monumento[2]},{monumento[3]}")

Ora possiamo aprire Google Maps e semplicemente copiare le coordinate del monumento che ci interessa, oppure effettuare ulteriori analisi!

Come vedete potete fare proprio tutto quello che volete con questi database una volta che ne avete ottenuto accesso. Inoltre, una volta appreso questo semplice sistema per la lettura dei CSV, anche il lavoro d'ufficio sarà estremamente semplificato, garantito!

Vi invito quindi a farvi un giro per il sito italiano dedicato agli open-data e cercare i dataset che più ritenete interessanti e provate ad esercitarvi, fatemi sapere poi nei commenti su YouTube come vi siete trovati con questo modulo!