No title Revision 353535383134 (Wed Dec 07 2011 at 14:46) - Diff Link to this snippet: https://friendpaste.com/iSoHtCYMcsNAy0I07IuOy Embed: manni perldoc borland colorful default murphy trac fruity autumn bw emacs pastie friendly Show line numbers Wrap lines 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168## ATTENZIONE: Per questo esercizio bisogna avere nella stessa directory## il file denominato "dati.csv" e "dati2.csv" con i dati a fine scriptimport sysimport csvimport 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 "-"*50print "Lista dei dialetti"print csv.list_dialects()printprint "-"*50print "Creiamo alcuni dialetti"# Creiamo dei dialetti a seconda dei parametri# Il dialetto denominato "europeo" in seguito e' quello usato di solito da noi italianicsv.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)printprint "-"*50print "Rivediamo la lista dei dialetti"# Rivediamo la lista dei dialetti:print csv.list_dialects()raw_input("Premi invio per continuare...")printprintprint################################################## Oggetto READER (SENZA DIALETTO)#################################################filecsv = open("dati.csv","rt")lettore=csv.reader(filecsv)print "-"*50print "Stampo la lista dei records letti senza dialetto:"for riga in lettore: print rigafilecsv.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 quoting3) 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 decimalimentre per lo script e' il delimitatore di campo. Ne consegue un errore fondamentale e la necessita'di specificare il delimitatore.'''print stringaraw_input("Premi invio per continuare...")printprintprint################################################## 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 modificatoprint "-"*50filecsv = open("dati.csv","rt")lettore=csv.reader(filecsv, dialect="europeo")print "Stampo la lista dei records letti con dialetto:"for riga in lettore: print rigafilecsv.close()print "A questo punto tutto sembra andare meglio"raw_input("Premi invio per continuare...")printprintprint################################################## 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 "-"*50filecsv = 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 rigafilecsv.close()raw_input("Premi invio per continuare...")printprintprint################################################## 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 "-"*50print "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()printprintprint