--- Revision None +++ Revision 353535383134 @@ -0,0 +1,168 @@ +## ATTENZIONE: Per questo esercizio bisogna avere nella stessa directory +## il file denominato "dati.csv" e "dati2.csv" con i dati a fine script + +import sys +import csv +import os + +################################################# +# DIALETTI e QUOTING +################################################# + +## --------------- I parametri dei dialetti + +## Un dialetto si specifica con tutti i parametri utili per fare +## l'analisi in lettura e scrittura. +## Ciascun aspetto del formato del file puo' essere specificato: +## Attributo( Valore di Default) --> Significato +## delimiter ( , ) --> E' il separatore di campo (un solo carattere) +## doublequote ( True ) --> Flag che controlla se il quotechar e' doppio o no +## escapechar ( None ) --> Carattere usato per indicare un escape +## lineterminator ( \r\n ) --> Stringa usata dal writer per terminare una linea +## quotechar ( " ) --> Indica che i campi contengono stringa (un solo carattere) +## quoting ( QUOTE_MINIMAL ) --> Controlla il comportamento del quoting +## skipinitialspace ( False ) --> Ignora gli spazi bianchi dopo il delimitatore di campo + + +## --------------- Quoting + +## Spendiamo due parole in piu' sul quoting. +## Ci sono 4 differenti opzioni definite come costanti nel modulo csv: +## QUOTE_ALL: quota tutto, indipendentemente dal tipo di dato. +## QUOTE_MINIMAL: quota i campi con caratteri speciali (qualsiasicosa possa essere confuso dal parser). Questo e' il default. +## QUOTE_NONNUMERIC: quota tutti i campi che non hanno un tipo di dato integer o float. Il reader converte i campi non quotati in float. +## QUOTE_NONE: Non quota nulla nel writer. Nel reader, invece, il carattere di quoting e' inglobato nel campo. + + + +# Vediamo la lista dei dialetti: +print "-"*50 +print "Lista dei dialetti" +print csv.list_dialects() +print + +print "-"*50 +print "Creiamo alcuni dialetti" +# Creiamo dei dialetti a seconda dei parametri +# Il dialetto denominato "europeo" in seguito e' quello usato di solito da noi italiani +csv.register_dialect('europeo', delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL) +csv.register_dialect('escaped', escapechar='\\', doublequote=False, quoting=csv.QUOTE_NONE) +csv.register_dialect('singlequote', quotechar="'", quoting=csv.QUOTE_ALL) +print + +print "-"*50 +print "Rivediamo la lista dei dialetti" +# Rivediamo la lista dei dialetti: +print csv.list_dialects() + +raw_input("Premi invio per continuare...") +print +print +print + + +################################################# +# Oggetto READER (SENZA DIALETTO) +################################################# +filecsv = open("dati.csv","rt") +lettore=csv.reader(filecsv) + +print "-"*50 +print "Stampo la lista dei records letti senza dialetto:" +for riga in lettore: + print riga + +filecsv.close() + +stringa='''Come si vede dall'output dei record, questo e' un disastro! + +1) Elementi non riconosciuti +['23922;0;16320;8'] risulta essere un unico elemento di array e non 4 differenti elementi distinti. +Questo e' dovuto al mancato riconoscimento del delimitatore. + +2) Quoting non riconosciuto +['52592;"1320";"26400";11'] non riconosce le virgolette come quoting + +3) Delimitatore errato +['53440;"1578', '96";20640;11'] si nota come il sistema riconosca due elementi nell'array. +Questi sono dovuti al riconoscimento di una virgola che, per noi e' il separatore dei decimali +mentre per lo script e' il delimitatore di campo. Ne consegue un errore fondamentale e la necessita' +di specificare il delimitatore. +''' + +print stringa +raw_input("Premi invio per continuare...") +print +print +print + + +################################################# +# Oggetto READER (CON DIALETTO) +################################################# +## A questo punto bisogna sistemare il file dati.csv. +## In particolare e' necessario fare particolarmente attenzione alla virgola: bisogna +## modificare il delimitatore dalla virgola al punto e virgola. +## Di conseguenza se, nel file, ci sono dei ; sara' necessario, prima, eliminarli magari sostituendoli con un punto. +## Andiamo ad analizzare il file dati2.csv che sarebbe il file dati.csv modificato + +print "-"*50 +filecsv = open("dati.csv","rt") +lettore=csv.reader(filecsv, dialect="europeo") +print "Stampo la lista dei records letti con dialetto:" +for riga in lettore: + print riga + +filecsv.close() + +print "A questo punto tutto sembra andare meglio" +raw_input("Premi invio per continuare...") +print +print +print + + +################################################# +# Oggetto READER (CON DIALETTO USANDO I NOMI DI CAMPO) +################################################# +## A questo punto una funzionalita' particolarmente interessante ed importante +## e' rappresentata dalla possibilita' di identificare i campi non tanto +## come l'elemento numero 0,1,2.... bensi' con il loro nome... +## A questo scopo ci viene in aiuto DictReader +## Questo oggetto preleva le intestazioni della prima riga e le ripropone come +## intestazione del nome del campo nelle successive. +## IMPORTANTISSIMO!! +## Vediamo come... + +print "-"*50 +filecsv = open("dati.csv","rt") +lettore=csv.DictReader(filecsv, dialect="europeo") +print "Stampo la lista dei records letti con dialetto e intestazioni di campo:" +for riga in lettore: + print riga + +filecsv.close() +raw_input("Premi invio per continuare...") +print +print +print + + +################################################# +# Oggetto WRITER (SENZA DIALETTO) +################################################# +## A questo punto proviamo a stampare un file CSV usando l'oggetto writer +## Non usiamo alcun dialetto ma la modalita' sarebbe la stessa che nel reader. +print "-"*50 +print "Creaiamo il file dati3.csv" +filecsv = open("dati3.csv", 'wt') +writer = csv.writer(filecsv) +writer.writerow( ('Title 1', 'Title 2', 'Title 3') ) + +for i in range(10): + writer.writerow( (i+1, chr(ord('a') + i), '08/%02d/07' % (i+1)) ) + +filecsv.close() +print +print +print