Riferimenti: SoftPython - formati 2
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
file di testo
dati tabulari
'Comma Separated Value'
;
, tab
, |
, ...)formato molto semplice
maggiore controllo in lettura
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
a) una riga alla volta
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 ?
Prova ad aprire in Excel e/o LibreOffice Calc, guarda le opzioni che ti vengono presentate:
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ì:
File-> Importa
Dati
e poi seleziona Da testo
. Per ulteriori riferimenti su Excel, vedere guida di Salvatore Aranzullalettore
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 apertura file testuale, con parametro creazione oggetto iterazione
|
lettore
?¶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?
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']]
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']]
[]
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.
Tramite l'oggetto csv.DictReader sarai in grado di recuperare dizionari
le chiavi saranno i nomi dei campi presi dall'intestazione
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:
dict
OrderedDict
dict
Puoi facilmente creare un CSV instanziando un oggetto writer
:
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 !!!
Per scrivere un nuovo CSV esempio-1-arricchito.csv prendendo dati da un CSV esistente:
with
per la scrittura dentro uno per la letturaimport 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
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:
esempio-1-arricchito.csv')
che per gli handle (es: csv_da_scrivere
)