a | b | |
---|
| 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 |
---|
... | |
---|