Formati file 2: CSV¶

Riferimenti: SoftPython - formati 2

  • visualizza al meglio in
  • versione stampabile: clicca qua
  • per navigare nelle slide: premere Esc


Summer School Data Science 2023 - Modulo 1 informatica: Moodle

Docente: David Leoni david.leoni@unitn.it

Esercitatore: Luca Bosotti luca.bosotti@studenti.unitn.it

CSV¶

Riferimenti

  • SoftPython Formati 2 - CSV

esempio-1.csv

animale,anni
cane,12
gatto,14
pellicano,30
scoiattolo,6
aquila,25

file di testo

dati tabulari

'Comma Separated Value'

  • anche altri separatori (;, tab, |, ...)

Perchè usare CSV?¶

esempio-1.csv

animale,anni
cane,12
gatto,14
pellicano,30
scoiattolo,6
aquila,25

formato molto semplice

maggiore controllo in lettura

  • es. non scambiano giorni con mesi nelle date..

Come è fatto un CSV?¶

File esempio-1.csv

animale,anni
cane,12
gatto,14
pellicano,30
scoiattolo,6
aquila,25

prima linea: nomi delle colonne, separati da virgole es. animale, anni

corpo: campi separati da virgole , es. cane, 12

non ci sono spazi dopo le virgole

Come leggere un CSV?¶

a) una riga alla volta

  • utile per CSV enormi

b) caricare tutto in RAM (es. con Pandas)

DOMANDA: se vogliamo sapere se un certo file da 100 terabyte contiene almeno 3 milioni di righe in cui è presente la parola 'pippo'...

Dobbiamo mettere in RAM contemporaneamente tutte le righe?

DOMANDA: E se volessimo partendo da un file da 100 terabyte crearne un'altro con gli stessi contenuti del primo file a cui a tutte le righe è aggiunta la parola 'pippo' alla fine...

Dovremmo mettere in RAM contemporaneamente tutte le righe del primo file?

E quelle del secondo ?

Aprire un csv in Excel¶

Prova ad aprire in Excel e/o LibreOffice Calc, guarda le opzioni che ti vengono presentate:

  • il semplice esempio-1.csv
  • un file un po' più complesso: impianti-bifuni.csv

ATTENZIONE SE USI Excel!

Facendo direttamente File->Apri in Excel, probabilmente Excel cercherà di immaginarsi da solo come intabellare il CSV, e potrebbe sbagliare a caricare alcune cose (esempi tipici: potrebbe non rilevare il separatore giusto, o sbagliare completamente le date). Per ovviare al problema, dobbiamo dire ad Excel di mostrare un pannello per chiederci come vogliamo aprire il CSV, facendo così:

  • In Excel vecchi, cerca File-> Importa
  • In Excel recenti, clicca la scheda Dati e poi seleziona Da testo. Per ulteriori riferimenti su Excel, vedere guida di Salvatore Aranzulla

lettore CSV in Python¶

import csv

with open('esempio-1.csv', encoding='utf-8', newline='') as f:

    lettore = csv.reader(f, delimiter=',') 

    for riga in lettore:     
        print(riga)

Output

['animale', 'anni']
['cane', '12']
['gatto', '14']
['pellicano', '30']
['scoiattolo', '6']
['aquila', '25']

Modulo csv nativo

apertura file testuale, con parametro newline=''

creazione oggetto lettore

iterazione for su oggetto lettore

riga è una lista

Cos'è esattamente lettore ?¶

In [2]:
import csv
with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
    lettore = csv.reader(f, delimiter=',')     
    print(lettore)
<_csv.reader object at 0x7f22ef202bd0>

lettore è una specie di macchinetta ferma

conosce solo la posizione in cui sta guardando all'interno del file

Come attivarla?

Come materializzare una sequenza?¶

In [3]:
import csv
with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
    lettore = csv.reader(f, delimiter=',')     
    print(list(lettore))
[['animale', 'anni'], ['cane', '12'], ['gatto', '14'], ['pellicano', '30'], ['scoiattolo', '6'], ['aquila', '25']]

Consumerai due volte nel with?¶

import csv
with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
    lettore = csv.reader(f, delimiter=',')     
    print(list(lettore))
    print(list(lettore))
[['animale', 'anni'], ['cane', '12'], ['gatto', '14'], ['pellicano', '30'], ['scoiattolo', '6'], ['aquila', '25']]
[]

Consumerai fuori dal with ?¶

import csv
with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
    lettore = csv.reader(f, delimiter=',')      

print(list(lettore))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[30], line 6
      4 with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
      5     lettore = csv.reader(f, delimiter=',')       
      6  
----> 7 print(list(lettore))

ValueError: I/O operation on closed file.

Leggere come dizionari¶

Tramite l'oggetto csv.DictReader sarai in grado di recuperare dizionari

le chiavi saranno i nomi dei campi presi dall'intestazione

In [4]:
import csv
with open('esempio-1.csv', encoding='utf-8', newline='') as f:    
    lettore = csv.DictReader(f, delimiter=',')   # Notice we now used DictReader
    for diz in lettore:
        print(diz)
OrderedDict([('animale', 'cane'), ('anni', '12')])
OrderedDict([('animale', 'gatto'), ('anni', '14')])
OrderedDict([('animale', 'pellicano'), ('anni', '30')])
OrderedDict([('animale', 'scoiattolo'), ('anni', '6')])
OrderedDict([('animale', 'aquila'), ('anni', '25')])

NOTA: diverse versioni di Python producono diversi dizionari:

  • $<$ 3.6: dict
  • 3.6, 3.7: OrderedDict
  • $\geq$ 3.8: dict

Scrivere un CSV¶

Puoi facilmente creare un CSV instanziando un oggetto writer:

In [5]:
import csv

with open('file-scritto.csv','w',encoding='utf-8',newline='') as f_scrittura: 
    
    scrittore = csv.writer(f_scrittura, delimiter=',')    
    
    scrittore.writerow(['Questo', 'è', 'uno header'])
    scrittore.writerow(['Questa', 'è', 'una riga'])
    scrittore.writerow(['Altra', 'riga', 'di esempio'])

Per scrivere, RICORDATI di specificare l'opzione 'w'

ATTENZIONE: 'w' rimpiazza completamente eventuali file esistenti!

ATTENZIONE: ASSICURATI DI SCRIVERE NEL FILE GIUSTO!

Se non stai più che attento ai nomi dei file, rischi di cancellare dati !!!

Leggere e scrivere un CSV 1/2¶

Per scrivere un nuovo CSV esempio-1-arricchito.csv prendendo dati da un CSV esistente:

  • annidare un with per la scrittura dentro uno per la lettura
In [6]:
import csv

# ATTENZIONE: l'handle *esterno* l'abbiamo chiamato f_lettura
with open('esempio-1.csv', encoding='utf-8', newline='') as f_lettura:    
    lettore = csv.reader(f_lettura, delimiter=',')      

    # Nota come questo 'with' sia dentro quello esterno    
    # Per scrivere, RICORDATI di specificare l'opzione 'w'
    # ATTENZIONE: 'w' rimpiazza *completamente* eventuali file  esistenti!
    # ATTENZIONE: l'handle *interno* l'abbiamo chiamato  f_scrittura
    with open('esempio-1-arricchito.csv','w',encoding='utf-8',newline='') as f_scrittura: 
        scrittore = csv.writer(f_scrittura, delimiter=',')
        
        for riga in lettore:
            riga.append("qualcos'altro")
            scrittore.writerow(riga)           
            
        print("Finito di scrivere", f_scrittura.name)
Finito di scrivere esempio-1-arricchito.csv

Leggere e scrivere un CSV 2/2¶

ATTENZIONE A SCAMBIARE I NOMI DEI FILE!

Quando leggiamo e scriviamo è facile commettere un errore e sovrascrivere accidentalmente i nostri preziosi dati

Per evitare problemi:

  • usa nomi espliciti sia per i file di output (es: esempio-1-arricchito.csv') che per gli handle (es: csv_da_scrivere)
  • fai una copia di backup dei dati da leggere
  • controlla sempre prima di eseguire il codice !
In [7]: