Revision 353535383134 () - Diff

Link to this snippet: https://friendpaste.com/iSoHtCYMcsNAy0I07IuOy
Embed:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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