Video Corso Base di Python 3

26: Come Leggere File CSV

In questo nuovo tutorial spiegheremo come fare a leggere file CSV tramite Python.

Per chi non conoscesse questa tipologia di file, CSV sta per Comma Separated Values: si tratta di una delle estensioni più utilizzate sopratutto in ambito scientifico o quando si ha comunque a che fare con grosse quantità di dati.

Si tratta in sostanza 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 chiudere questa breve parte introduttiva, aggiungo che per quanto la traduzione letterale del nome sia: "Valori Separati Da Virgole", si tratta di un formato un pó bizzarro, in quanto il carattere delimitatore puó essere sia una virgola o un punto e virgola o un altro carattere:

Ad esempio, se creo un file di testo e ci inserisco:

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

E poi lo salvo con estensione CSV, questo potrà essere interpretato anche da CALC proprio come un tabulato, in cui i valori sono stati separati appunto da virgole. Volendo avrei 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:

import 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.

Ora che abbiamo il nostro bel file sotto tiro, possiamo finalmente iniziare ad utilizzare il modulo CSV.

Per leggerlo utilizziamo la funzione reader() che restituisce un oggetto di tipo reader, ovvero lettore, che cicla per tutte le righe del nostro file CSV.

Alla funzione 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)

<_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)

['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!


Menu della Serie