├── .gitignore ├── README.md ├── files ├── .replit ├── DispenseProgLab.pdf ├── data.csv ├── foglio1_esercizi.pdf ├── foglio2_esercizi.pdf ├── shampoo_sales.csv └── shampoo_sales.txt ├── slides ├── Parte1.pdf ├── Parte10.pdf ├── Parte2.pdf ├── Parte3.pdf ├── Parte4.pdf ├── Parte5.pdf ├── Parte6.pdf ├── Parte7.pdf ├── Parte8.pdf └── Parte9.pdf └── soluzioni └── lezione5 ├── README.md └── soluzione.py /.gitignore: -------------------------------------------------------------------------------- 1 | .project 2 | .pydevproject 3 | .DS_STORE 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProgrammingLab 2 | 3 | Sito web del corso di Laboratorio di Programmazione per Intelligenza Artificiale e per Statistica dell'Università degli studi di Trieste. 4 | 5 | 6 | ## Informazioni 7 | **Docente:** Stefano Alberto Russo [stefanoalberto.russo@phd.units.it](mailto:stefanoalberto.russo@phd.units.it) 8 | 9 | **Aula ed orario:** Giovedì 13-16, aula Morin 2a. 10 | 11 | **Esame**: compito per casa con qualche giorno a disposizione e discussione all' orale 12 | 13 | **Aiuto:** La modalità principale è chiedere ai tutor: [lucrezia.valeriani@phd.units.it](mailto:lucrezia.valeriani@phd.units.it) e [valentina.blasone@phd.units.it](mailto:valentina.blasone@phd.units.it). Alternativamente, potete anche scrivermi per fissare un appuntamento come ricevimento studenti. 14 | 15 | **Materiale:** Ci sono le [dispense](files/DispenseProgLab.pdf) e ci sono le slides di lezione, che trovate qui sotto, assieme agli esercizi (sia proposti dai tutor che in genere uno alla fine di ogni lezione) di cui verranno pubblicate alcune soluzioni. Essendo un corso di laboratorio, non c'è un vero e proprio libro di testo di riferimento. 16 | 17 | ## News 18 | 19 | - **20/12/2023**: Lezione del 21/12 annullata, verrà recuperata il 10/1 dalle 11 alle 14. 20 | 21 | - **18/12/2023**: Fissati gli appelli invernali: Venerdì 16 Febbraio e Venerdì 1 Marzo, entrambi alle 11:00. 22 | 23 | - **14/12/2023**: Online le [dispense](files/DispenseProgLab.pdf) in prima versione ufficiale. 24 | 25 | - **1/12/2023**: Online la [soluzione](soluzioni/lezione5) per l'esercizio della perte 5 e precedenti. 26 | 27 | - **17/11/2023**: Cambio orario: lezione il 22 dalle 11 alle 14, il 30 lezione annullata. 28 | 29 | 30 | - **9/11/2023**: Reset del repo per il nuovo anno accademico 31 | 32 | 33 | ## Lezioni e slides 34 | 35 | - **Lezione 1** (9/11/2023): 36 | 37 | - Prima ora: Introduzione e strumenti | [slides](slides/Parte1.pdf) 38 | - Seconda e terza ora: intro/recap su Python - tipi dati, costrutti, 39 | funzioni, moduli, be pythonic [slides](slides/Parte2.pdf) 40 | 41 | - **Lezione 2** (16/11/2023): 42 | - Prima ora: esercizio base su Python 43 | - Seconda ora: i dati, interagire con i file ed il formato CSV | [slides](slides/Parte3.pdf) | [shampoo_sales.csv](files/shampoo_sales.csv) | [shampoo_sales.txt](files/shampoo_sales.txt) 44 | - Terza ora: esercizio sull'interazione con i dati 45 | 46 | - **Lezione 3** (22/11/2023): 47 | 48 | - Prima e seconda ora: gli oggetti in Python | [slides](slides/Parte4.pdf) 49 | - Terza ora: esercizio sugli oggetti [Foglio esercizi 1](files/foglio1_esercizi.pdf) 50 | 51 | - **Lezione 4** (23/11/2023): 52 | - Prima ora: le eccezioni ed il flusso try-except 53 | | [slides](slides/Parte5.pdf) 54 | - Seconda ora: esercizio sulle eccezioni 55 | - Terza ora: controllo degli input e sanitizzazione 56 | | [slides](slides/Parte6.pdf) 57 | 58 | - **Lezione 5** (7/12/2023): 59 | - Prima ora: esercizio su controllo degli input 60 | - Seconda ora: testing e unit tests 61 | | [slides](slides/Parte7.pdf) 62 | - Terza ora: esercizio sul testing 63 | 64 | - **Lezione 6** (14/12/2023): 65 | - Prima ora: lavorare veramente - creiamo un modello 66 | | [slides](slides/Parte8.pdf) 67 | - Seconda ora: esercizio su come creare un modello 68 | - Terza ora: lavorare veramente - fittiamo un modello 69 | | [slides](slides/Parte9.pdf) 70 | 71 | - **Lezione 7** (10/1/2024 11:00-14:00): 72 | - Prima ora esercizio su come fittare un modello 73 | - Seconda ora: lavorare veramente - valutiamo un modello | [slides](slides/Parte10.pdf) 74 | - Terza ora: soluzioni, discussione e conclusione del corso 75 | 76 | - **Lezione 8** (11/1/2024): esercitazione d'esame 77 | 78 | 79 | ## Modalità di esame 80 | 81 | La modalità di esame è la seguente: 82 | 83 | 1. Qualche giorno prima dell'appello verrà pubblicato sul sito un compito per casa, che sarà simile a quelli visti nelle esercitazioni ma più lungo e complicato. Potrete svolgerlo con tutti gli strumenti di supporto che vorrete (libri, internet etc.) ma se ve lo fate fare da qualcuno poi tranquilli che all'orale casca il palco. In genere si vede subito se non avete scritto voi il vostro codice. 84 | 85 | 2. Il giorno dell'esame, il vostro codice verrà sottoposto a testing automatico (tramite unit-testing) e poi discusso assieme. **La consegna dell'esame deve avvenire tassativamente entro l'ora di inizio dell'appello orale**, e può avvenire in due modi. In entrambi dovete mandare una mail a [stefanoalberto.russo@phd.units.it](mailto:stefanoalberto.russo@phd.units.it), dal vostro indirizzo email universitario, e potete: 86 | 87 | a. allegare lo script `esame.py`, oppure 88 | 89 | b. inserire il link diretto al codice sul vostro repository su GitHub (o altro sistema di versionamento) *comprensivo* di hash da valutare. Vedi Nota 2 per maggiori dettagli. Per poter ambire al 30 e lode, dovete mandare l'esame con questo sistema. 90 | 91 | 92 | 3. Il voto d'esame sarà dato dal voto assegnato dalla correzione automatica e dalla discussione. 93 | 94 | 4. Nel caso in cui la correzione automatica dia un voto molto basso sul vostro codice o non funzioni proprio, nel caso ciò fosse dovuto ad una svista (come ad esempio se avete chiamato col nome sbagliato una funzione) potrete provare a sistemare la cosa durante la discussione. Altrimenti, non sarà raggiunta la sufficienza. 95 | 96 | 97 | ***Nota 1:*** **Dovete sempre ed in ogni caso iscrivervi agli appelli su Esse3!** 98 | 99 | ***Nota 2:*** per mandare il codice come link a repository GitHub con hash, potete avere accesso a questo tipo di link cliccando su `commits`, che vi porterà alla lista di commit del vostro repository, e poi su `<>` per visionare il codice ad un particolare punto nella storia (cioè ad uno specifico hash). A questo punto cliccate sul file (ad esempio `esame.py`), e nella barra di navigazione del Browser avete ora un'URL al file contenente anche l'hash di quella specifica versione. Dovete mandare questo. 100 | 101 | ***Nota 3*** il file `esame.py` non deve includere i vostri esempi o prove e tantomeno richieste di input da parte dell'utente, ma solo ed esclusivamente quello che viene chiesto dal testo (in genere una classe, una funzione ed una eccezione). 102 | 103 | 104 | 105 | ## Licenza d'uso 106 | 107 | Copyright © Stefano Alberto Russo. 108 | 109 | I materiali sono distribuiti sotto licenza [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/), che vuol dire grossomodo che a condizione di citare l'autore e di utilizzare la stessa tipologia di licenza, questi possono essere liberamente copiati, modificati, usati per creare opere derivate e ridistribuiti. 110 | 111 | ![CC BY-SA 4.0 logo!](https://i.creativecommons.org/l/by-sa/4.0/88x31.png "CC BY-SA 4.0") 112 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /files/.replit: -------------------------------------------------------------------------------- 1 | language = "bash" 2 | run = "/bin/bash" -------------------------------------------------------------------------------- /files/DispenseProgLab.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/files/DispenseProgLab.pdf -------------------------------------------------------------------------------- /files/data.csv: -------------------------------------------------------------------------------- 1 | date,passengers 2 | 1949-01,112 3 | 1949-02,118 4 | 1949-03,132 5 | 1949-04,129 6 | 1949-05,121 7 | 1949-06,135 8 | 1949-07,148 9 | 1949-08,148 10 | 1949-09,136 11 | 1949-10,119 12 | 1949-11,104 13 | 1949-12,118 14 | 1950-01,115 15 | 1950-02,126 16 | 1950-03,141 17 | 1950-04,135 18 | 1950-05,125 19 | 1950-06,149 20 | 1950-07,170 21 | 1950-08,170 22 | 1950-09,158 23 | 1950-10,133 24 | 1950-11,114 25 | 1950-12,140 26 | 1951-01,145 27 | 1951-02,150 28 | 1951-03,178 29 | 1951-04,163 30 | 1951-05,172 31 | 1951-06,178 32 | 1951-07,199 33 | 1951-08,199 34 | 1951-09,184 35 | 1951-10,162 36 | 1951-11,146 37 | 1951-12,166 38 | 1952-01,171 39 | 1952-02,180 40 | 1952-03,193 41 | 1952-04,181 42 | 1952-05,183 43 | 1952-06,218 44 | 1952-07,230 45 | 1952-08,242 46 | 1952-09,209 47 | 1952-10,191 48 | 1952-11,172 49 | 1952-12,194 50 | 1953-01,196 51 | 1953-02,196 52 | 1953-03,236 53 | 1953-04,235 54 | 1953-05,229 55 | 1953-06,243 56 | 1953-07,264 57 | 1953-08,272 58 | 1953-09,237 59 | 1953-10,211 60 | 1953-11,180 61 | 1953-12,201 62 | 1954-01,204 63 | 1954-02,188 64 | 1954-03,235 65 | 1954-04,227 66 | 1954-05,234 67 | 1954-06,264 68 | 1954-07,302 69 | 1954-08,293 70 | 1954-09,259 71 | 1954-10,229 72 | 1954-11,203 73 | 1954-12,229 74 | 1955-01,242 75 | 1955-02,233 76 | 1955-03,267 77 | 1955-04,269 78 | 1955-05,270 79 | 1955-06,315 80 | 1955-07,364 81 | 1955-08,347 82 | 1955-09,312 83 | 1955-10,274 84 | 1955-11,237 85 | 1955-12,278 86 | 1956-01,284 87 | 1956-02,277 88 | 1956-03,317 89 | 1956-04,313 90 | 1956-05,318 91 | 1956-06,374 92 | 1956-07,413 93 | 1956-08,405 94 | 1956-09,355 95 | 1956-10,306 96 | 1956-11,271 97 | 1956-12,306 98 | 1957-01,315 99 | 1957-02,301 100 | 1957-03,356 101 | 1957-04,348 102 | 1957-05,355 103 | 1957-06,422 104 | 1957-07,465 105 | 1957-08,467 106 | 1957-09,404 107 | 1957-10,347 108 | 1957-11,305 109 | 1957-12,336 110 | 1958-01,340 111 | 1958-02,318 112 | 1958-03,362 113 | 1958-04,348 114 | 1958-05,363 115 | 1958-06,435 116 | 1958-07,491 117 | 1958-08,505 118 | 1958-09,404 119 | 1958-10,359 120 | 1958-11,310 121 | 1958-12,337 122 | 1959-01,360 123 | 1959-02,342 124 | 1959-03,406 125 | 1959-04,396 126 | 1959-05,420 127 | 1959-06,472 128 | 1959-07,548 129 | 1959-08,559 130 | 1959-09,463 131 | 1959-10,407 132 | 1959-11,362 133 | 1959-12,405 134 | 1960-01,417 135 | 1960-02,391 136 | 1960-03,419 137 | 1960-04,461 138 | 1960-05,472 139 | 1960-06,535 140 | 1960-07,622 141 | 1960-08,606 142 | 1960-09,508 143 | 1960-10,461 144 | 1960-11,390 145 | 1960-12,432 146 | -------------------------------------------------------------------------------- /files/foglio1_esercizi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/files/foglio1_esercizi.pdf -------------------------------------------------------------------------------- /files/foglio2_esercizi.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/files/foglio2_esercizi.pdf -------------------------------------------------------------------------------- /files/shampoo_sales.csv: -------------------------------------------------------------------------------- 1 | Date,Sales 2 | 01-01-2012,266.0 3 | 01-02-2012,145.9 4 | 01-03-2012,183.1 5 | 01-04-2012,119.3 6 | 01-05-2012,180.3 7 | 01-06-2012,168.5 8 | 01-07-2012,231.8 9 | 01-08-2012,224.5 10 | 01-09-2012,192.8 11 | 01-10-2012,122.9 12 | 01-11-2012,336.5 13 | 01-12-2012,185.9 14 | 01-01-2013,194.3 15 | 01-02-2013,149.5 16 | 01-03-2013,210.1 17 | 01-04-2013,273.3 18 | 01-05-2013,191.4 19 | 01-06-2013,287.0 20 | 01-07-2013,226.0 21 | 01-08-2013,303.6 22 | 01-09-2013,289.9 23 | 01-10-2013,421.6 24 | 01-11-2013,264.5 25 | 01-12-2013,342.3 26 | 01-01-2014,339.7 27 | 01-02-2014,440.4 28 | 01-03-2014,315.9 29 | 01-04-2014,439.3 30 | 01-05-2014,401.3 31 | 01-06-2014,437.4 32 | 01-07-2014,575.5 33 | 01-08-2014,407.6 34 | 01-09-2014,682.0 35 | 01-10-2014,475.3 36 | 01-11-2014,581.3 37 | 01-12-2014,646.9 38 | -------------------------------------------------------------------------------- /files/shampoo_sales.txt: -------------------------------------------------------------------------------- 1 | Date,Sales 2 | 01-01-2012,266.0 3 | 01-02-2012,145.9 4 | 01-03-2012,183.1 5 | 01-04-2012,119.3 6 | 01-05-2012,180.3 7 | 01-06-2012,168.5 8 | 01-07-2012,231.8 9 | 01-08-2012,224.5 10 | 01-09-2012,192.8 11 | 01-10-2012,122.9 12 | 01-11-2012,336.5 13 | 01-12-2012,185.9 14 | 01-01-2013,194.3 15 | 01-02-2013,149.5 16 | 01-03-2013,210.1 17 | 01-04-2013,273.3 18 | 01-05-2013,191.4 19 | 01-06-2013,287.0 20 | 01-07-2013,226.0 21 | 01-08-2013,303.6 22 | 01-09-2013,289.9 23 | 01-10-2013,421.6 24 | 01-11-2013,264.5 25 | 01-12-2013,342.3 26 | 01-01-2014,339.7 27 | 01-02-2014,440.4 28 | 01-03-2014,315.9 29 | 01-04-2014,439.3 30 | 01-05-2014,401.3 31 | 01-06-2014,437.4 32 | 01-07-2014,575.5 33 | 01-08-2014,407.6 34 | 01-09-2014,682.0 35 | 01-10-2014,475.3 36 | 01-11-2014,581.3 37 | 01-12-2014,646.9 38 | -------------------------------------------------------------------------------- /slides/Parte1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte1.pdf -------------------------------------------------------------------------------- /slides/Parte10.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte10.pdf -------------------------------------------------------------------------------- /slides/Parte2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte2.pdf -------------------------------------------------------------------------------- /slides/Parte3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte3.pdf -------------------------------------------------------------------------------- /slides/Parte4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte4.pdf -------------------------------------------------------------------------------- /slides/Parte5.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte5.pdf -------------------------------------------------------------------------------- /slides/Parte6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte6.pdf -------------------------------------------------------------------------------- /slides/Parte7.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte7.pdf -------------------------------------------------------------------------------- /slides/Parte8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte8.pdf -------------------------------------------------------------------------------- /slides/Parte9.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarusso/ProgrammingLab/62d838508b6d96148764e0607006b3e30d30f13c/slides/Parte9.pdf -------------------------------------------------------------------------------- /soluzioni/lezione5/README.md: -------------------------------------------------------------------------------- 1 | ## Soluzione esercizio lezione 5 2 | ### ...e precedenti. 3 | 4 | 5 | Codice per la soluzione (una delle tante): 6 | 7 | ```python 8 | 9 | 10 | #============================== 11 | # Classe per file CSV 12 | #============================== 13 | 14 | class CSVFile: 15 | 16 | def __init__(self, name): 17 | 18 | # Setto il nome del file 19 | self.name = name 20 | 21 | 22 | # Provo ad aprirlo e leggere una riga 23 | self.can_read = True 24 | try: 25 | my_file = open(self.name, 'r') 26 | my_file.readline() 27 | except Exception as e: 28 | self.can_read = False 29 | print('Errore in apertura del file: "{}"'.format(e)) 30 | 31 | 32 | def get_data(self): 33 | 34 | if not self.can_read: 35 | 36 | # Se nell'init ho settato can_read a False vuol dire che 37 | # il file non poteva essere aperto o era illeggibile 38 | print('Errore, file non aperto o illeggibile') 39 | 40 | # Esco dalla funzione tornando "niente". 41 | return None 42 | 43 | else: 44 | # Inizializzo una lista vuota per salvare tutti i dati 45 | data = [] 46 | 47 | # Apro il file 48 | my_file = open(self.name, 'r') 49 | 50 | # Leggo il file linea per linea 51 | for line in my_file: 52 | 53 | # Faccio lo split di ogni linea sulla virgola 54 | elements = line.split(',') 55 | 56 | # Posso anche pulire il carattere di newline 57 | # dall'ultimo elemento con la funzione strip(): 58 | elements[-1] = elements[-1].strip() 59 | 60 | # p.s. in realta' strip() toglie anche gli spazi 61 | # bianchi all'inizio e alla fine di una stringa. 62 | 63 | # Se NON sto processando l'intestazione... 64 | if elements[0] != 'Date': 65 | 66 | # Aggiungo alla lista gli elementi di questa linea 67 | data.append(elements) 68 | 69 | # Chiudo il file 70 | my_file.close() 71 | 72 | # Quando ho processato tutte le righe, ritorno i dati 73 | return data 74 | 75 | 76 | 77 | #============================== 78 | # Classe per file NumericalCSV 79 | #============================== 80 | 81 | class NumericalCSVFile(CSVFile): 82 | 83 | def get_data(self): 84 | 85 | # Chiamo la get_data del genitore 86 | string_data = super().get_data() 87 | 88 | # Preparo lista per contenere i dati ma in formato numerico 89 | numerical_data = [] 90 | 91 | # Ciclo su tutte le "righe" corrispondenti al file originale 92 | for string_row in string_data: 93 | 94 | # Preparo una lista di supporto per salvare la riga 95 | # in "formato" nuumerico (tranne il primo elemento) 96 | numerical_row = [] 97 | 98 | # Ciclo su tutti gli elementi della riga con un 99 | # enumeratore: cosi' ho gratis l'indice "i" della 100 | # posizione dell'elemento nella riga. 101 | for i,element in enumerate(string_row): 102 | 103 | if i == 0: 104 | # Il primo elemento della riga lo lascio in formato stringa 105 | numerical_row.append(element) 106 | 107 | else: 108 | # Converto a float tutto gli altri. Ma se fallisco, stampo 109 | # l'errore e rompo il ciclo (e poi saltero' la riga). 110 | try: 111 | numerical_row.append(float(element)) 112 | except Exception as e: 113 | print('Errore in conversione del valore "{}" a numerico: "{}"'.format(element, e)) 114 | break 115 | 116 | # Alla fine aggiungo la riga in formato numerico alla lista 117 | # "esterna", ma solo se sono riuscito a processare tutti gli 118 | # elementi. Qui controllo per la lunghezza, ma avrei anche potuto 119 | # usare una variabile di supporto o fare due break in cascata. 120 | if len(numerical_row) == len(string_row): 121 | numerical_data.append(numerical_row) 122 | 123 | return numerical_data 124 | 125 | 126 | 127 | #============================== 128 | # Esempio di utilizzo 129 | #============================== 130 | 131 | #mio_file = CSVFile(name='shampoo_sales.csv') 132 | #print('Nome del file: "{}"'.format(mio_file.name)) 133 | #print('Dati contenuti nel file: #"{}"'.format(mio_file.get_data())) 134 | 135 | #mio_file_numerico = NumericalCSVFile(name='shampoo_sales.csv') 136 | #print('Nome del file: "{}"'.format(mio_file_numerico.name)) 137 | #print('Dati contenuti nel file: "{}"'.format(mio_file_numerico.get_data())) 138 | 139 | ``` 140 | -------------------------------------------------------------------------------- /soluzioni/lezione5/soluzione.py: -------------------------------------------------------------------------------- 1 | 2 | #============================== 3 | # Classe per file CSV 4 | #============================== 5 | 6 | class CSVFile: 7 | 8 | def __init__(self, name): 9 | 10 | # Setto il nome del file 11 | self.name = name 12 | 13 | 14 | # Provo ad aprirlo e leggere una riga 15 | self.can_read = True 16 | try: 17 | my_file = open(self.name, 'r') 18 | my_file.readline() 19 | except Exception as e: 20 | self.can_read = False 21 | print('Errore in apertura del file: "{}"'.format(e)) 22 | 23 | 24 | def get_data(self): 25 | 26 | if not self.can_read: 27 | 28 | # Se nell'init ho settato can_read a False vuol dire che 29 | # il file non poteva essere aperto o era illeggibile 30 | print('Errore, file non aperto o illeggibile') 31 | 32 | # Esco dalla funzione tornando "niente". 33 | return None 34 | 35 | else: 36 | # Inizializzo una lista vuota per salvare tutti i dati 37 | data = [] 38 | 39 | # Apro il file 40 | my_file = open(self.name, 'r') 41 | 42 | # Leggo il file linea per linea 43 | for line in my_file: 44 | 45 | # Faccio lo split di ogni linea sulla virgola 46 | elements = line.split(',') 47 | 48 | # Posso anche pulire il carattere di newline 49 | # dall'ultimo elemento con la funzione strip(): 50 | elements[-1] = elements[-1].strip() 51 | 52 | # p.s. in realta' strip() toglie anche gli spazi 53 | # bianchi all'inizio e alla fine di una stringa. 54 | 55 | # Se NON sto processando l'intestazione... 56 | if elements[0] != 'Date': 57 | 58 | # Aggiungo alla lista gli elementi di questa linea 59 | data.append(elements) 60 | 61 | # Chiudo il file 62 | my_file.close() 63 | 64 | # Quando ho processato tutte le righe, ritorno i dati 65 | return data 66 | 67 | 68 | 69 | #============================== 70 | # Classe per file NumericalCSV 71 | #============================== 72 | 73 | class NumericalCSVFile(CSVFile): 74 | 75 | def get_data(self): 76 | 77 | # Chiamo la get_data del genitore 78 | string_data = super().get_data() 79 | 80 | # Preparo lista per contenere i dati ma in formato numerico 81 | numerical_data = [] 82 | 83 | # Ciclo su tutte le "righe" corrispondenti al file originale 84 | for string_row in string_data: 85 | 86 | # Preparo una lista di supporto per salvare la riga 87 | # in "formato" nuumerico (tranne il primo elemento) 88 | numerical_row = [] 89 | 90 | # Ciclo su tutti gli elementi della riga con un 91 | # enumeratore: cosi' ho gratis l'indice "i" della 92 | # posizione dell'elemento nella riga. 93 | for i,element in enumerate(string_row): 94 | 95 | if i == 0: 96 | # Il primo elemento della riga lo lascio in formato stringa 97 | numerical_row.append(element) 98 | 99 | else: 100 | # Converto a float tutto gli altri. Ma se fallisco, stampo 101 | # l'errore e rompo il ciclo (e poi saltero' la riga). 102 | try: 103 | numerical_row.append(float(element)) 104 | except Exception as e: 105 | print('Errore in conversione del valore "{}" a numerico: "{}"'.format(element, e)) 106 | break 107 | 108 | # Alla fine aggiungo la riga in formato numerico alla lista 109 | # "esterna", ma solo se sono riuscito a processare tutti gli 110 | # elementi. Qui controllo per la lunghezza, ma avrei anche potuto 111 | # usare una variabile di supporto o fare due break in cascata. 112 | if len(numerical_row) == len(string_row): 113 | numerical_data.append(numerical_row) 114 | 115 | return numerical_data 116 | 117 | 118 | 119 | #============================== 120 | # Esempio di utilizzo 121 | #============================== 122 | 123 | #mio_file = CSVFile(name='shampoo_sales.csv') 124 | #print('Nome del file: "{}"'.format(mio_file.name)) 125 | #print('Dati contenuti nel file: "{}"'.format(mio_file.get_data())) 126 | 127 | #mio_file_numerico = NumericalCSVFile(name='shampoo_sales.csv') 128 | #print('Nome del file: "{}"'.format(mio_file_numerico.name)) 129 | #print('Dati contenuti nel file: "{}"'.format(mio_file_numerico.get_data())) 130 | 131 | --------------------------------------------------------------------------------