iSoHtCYMcsNAy0I07IuOy changeset

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