[Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda Patterson » 12/02/2019, 02:21

Ciao a tutti! Avrei bisogno di aiuto. Sono agli inizi con Python :oops: .

Ho un esercizio che mi chiede di scrivere un programma Python che analizzi i dati di vendita di un negozio.
I dati sugli oggetti venduti sono contenuti in un file chiamato venduti.txt : ogni riga contiene il codice dell'oggetto seguito dal numero di pezzi venduti.
Il file chiamato catalogo.txt invece contiene il codice dell'oggetto, la quantità contenuta in ogni confezione, il tipo dell'oggetto e il prezzo dell'oggetto.
Il programma deve leggere i 2 file e caricarli in un'opportuna struttura dati.

Come faccio? Qualcuno può darmi una mano per uscirne? Magari è una cavolata :embarrassed:, ma non ho esercizi svolti da cui poter prendere spunto o farmi anche solo un'idea e sono agli inizi dello studio.


Se qualcuno volesse darmi un piccolo aiutino…
Grazie anticipatamente a chi vorrà aiutarmi.
Patterson
Starting Member
Starting Member
 
Messaggio: 1 di 22
Iscritto il: 12/02/2019, 02:14

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda apatriarca » 12/02/2019, 02:49

Ciao,

sarebbe utile capire qual'è il programma del corso in modo da comprendere meglio che tipo di funzionalità e librerie di Python è possibile utilizzare. Se in venduti.txt il codice e il numero sono semplicemente separati da uno spazio, puoi fare qualcosa del genere:
Codice:
venduti = {}
with open("venduti.txt") as file:          # Apre il file per la lettura
    for line in file.readlines():          # Legge una riga per volta
        codice, numero = line.split()      # Separa la riga in due stringhe
        venduti[codice] = int(numero)      # Scrive i valori in un dict

Non c'è il controllo degli errori e in base ai dettagli dell'esercizio potrebbero essere necessarie modifiche. Se per esempio nel file fosse possibile avere più righe con lo stesso codice allora è necessario modificare la riga che scrive i valori nel dizionario e forse anche la struttura dati scelta (un defaultdict per esempio). Per formati più o meno standard (per esempio csv o json o xml) Python fornisce poi librerie che permettono di caricari i dati con ancora più facilità.

Ho inserito solo la lettura di uno dei due file in quanto l'altra è molto simile, ma hai bisogno di caricare un numero maggiori di informazioni ed è quindi necessario modificare la struttura dati scelta.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5188 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda Patterson » 12/02/2019, 04:14

Ciao. Innanzitutto grazie mille.
E' un corso in cui Python è stato trattato in modo molto basico e molto semplificato, abbiamo fatto cicli e istruzioni condizionali, liste, tuple, i dizionari, uso e gestione dei file, lambda. Anche seguendo il corso però le esercitazioni sono state poche e poco chiare purtroppo, quindi mi ritrovo un mare di dubbi, che cerco di risolvere come posso. Ho anche consultato testi e slide trovate in rete, la teoria è ok, ma l'esame è pratico e la pratica mi sta causando un pò di problemi :( .
Il defaultdict proprio non so cosa sia, non ce l'hanno menzionato, siamo rimasti solo ai dizionari.


Per quanto riguarda la gestione degli errori, potrei fare così? :arrow:

Codice:
import sys
def esercizio ():

venduti = {}

try:

  with open("venduti.txt", 'r') as file:    #ho messo 'r' per indicare che voglio aprire il file in lettura,serve o è di default?
    for line in file.readlines():         
        codice, numero = line.split()     
        venduti[codice] = int(numero)

except IOError:
   
  print ("Il file %s non è stato trovato " % venduti.txt)
  sys.exit(-1)                                                              #condizione d'uscita che indica un errore




Per leggere l'altro file ho un dubbio, e mi scuso per la mia ignoranza :oops: .
In venduti.txt ho solo codice e numero degli oggetti venduti, in catalogo.txt invece ho 4 cose: codice,quantità,tipo e prezzo. In venduti.txt avevo un un oggetto con codice e una quantità associata, quindi dizionario con chiave e valore(io perlomeno ho capito questo). Come "gestisco" in catalogo.txt tutte queste cose? Ho sempre le prime due informazioni che avevo in venduti.txt, ma se ne aggiungono altre due.

E' sbagliato scrivere cosi? :arrow:
Codice:
catalogo={}
try:

  with open("catalogo.txt", 'r') as file:   
    for line in file.readlines():         
        codice, quantità,tipo,prezzo = line.split()      #ho scritto una stupidaggine?

except IOError:
   
  print ("Il file %s non è stato trovato " % catalogo.txt)
  sys.exit(-1)






Se ho scritto qualche assurdità perdonatemi :oops: .
Patterson
Starting Member
Starting Member
 
Messaggio: 2 di 22
Iscritto il: 12/02/2019, 02:14

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda apatriarca » 12/02/2019, 22:09

1. Il defaultdict è una specie di dizionario in cui hai definito un valore di default per tutti i valori. Se leggi un valore che non hai settato in precedenza viene aggiunta la chiave con il valore di default e restituito quel valore. E' utile in situazioni in cui stai ad esempio contando qualcosa (come le parole in una stringa o il numero totale di prodotti di un certo tipo acquistati nel caso in cui venduti permettesse più righe con lo stesso codice).

2. Il metodo per verificare errori di lettura è corretto, ma non sono gli unici errori che potrebbero capitare. Se una riga avesse ad esempio un numero diverso di valori verrebbe ad esempio generata una eccezione.

3. Puoi agire in modi diversi a seconda di cosa tu voglia fare con quei dati. Un metodo semplice potrebbe essere quello di avere un dizionario in cui la chiave è il codice e i valori sono una tupla contenente i restanti valori. Alternative potrebbero essere memorizzare i valori in una semplice lista (un valore per riga) o raggruppare i prodotti per tipo, poi codice e infine memorizzarne gli altri due valori. Non c'è un modo giusto e uno sbagliato.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5189 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda Patterson » 15/02/2019, 02:27

Grazie mille :smt023
Ci ho studiato un po' su...
:arrow: Vorrei, prima di passare a caricare i due file su una struttura dati, inserire una condizione per controllare che allo script siano passati abbastanza parametri, prima di assegnarli ad eventuali variabili. Ho letto che la lista di parametri della riga di comando viene inserita tramite sys.argv (argv funzione del modulo sys, contenente la lista di stringhe contenenti i parametri che vengono passati allo script quando lo si richiama), e quindi len(sys.argv) è il numero di argomenti della riga di comando.
Cioè
:arrow:

Codice:
import sys
def esercizio ():

 if len(sys.argv)!3:    #3 perchè sono il nome del programma + i 2 file da leggere (vendite e catalogo)
    print ("Errore sintassi: python %s <esercizio>" %sys.argv[0])    #il primo argomento della lista argv, quindi il valore ad indice 0,sarà il nome dello script
    exit(-1)

#e poi continuare col resto dell'esercizio, cioè caricando i file ecc...



Può andare o sbaglio?

:arrow: Un altro dubbio che ho: dopo l'apertura del file e il for
Codice:
 codice, numero = line.split() 

Lascio solo split (che mi divide la stringa in una sequenza di elementi) o è il caso di associare anche strip, che mi restituisce copia della stringa con eventuali caratteri rimossi?
Cioè :arrow:
Codice:
 codice, numero = line.strip.split()



Per quanto riguarda il problema dei 4 dati del file catalogo.txt credo che il modo più semplice per me sia, come mi hai consigliato, di usare il codice come chiave e memorizzare gli altri 3 dati come tupla o lista.


Grazie ancora per tutte le informazioni che mi hai dato, mi sono state preziose, altrimenti non avrei proprio saputo da che parte iniziare :)
Patterson
Starting Member
Starting Member
 
Messaggio: 6 di 22
Iscritto il: 12/02/2019, 02:14

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda apatriarca » 15/02/2019, 12:05

Se non specifichi il delimitatore nella funzione split, spazi consecutivi o all'inizio/fine della stringa vengono automaticamente eliminati. Non c'è insomma bisogno di usare strip (non dovrebbe avere alcun effetto insomma).

Per quanto riguarda la lettura di argomenti da linea di comando, ho sempre utilizzato la libreria argparse in Python. Il tuo metodo non è comunque tecnicamente sbagliato (a parte un errore nello scrivere "!=").
apatriarca
Moderatore
Moderatore
 
Messaggio: 5194 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Python] Esercizio semplice su lettura file e caricamento dati

Messaggioda Patterson » 15/02/2019, 18:02

apatriarca ha scritto:Se non specifichi il delimitatore nella funzione split, spazi consecutivi o all'inizio/fine della stringa vengono automaticamente eliminati. Non c'è insomma bisogno di usare strip (non dovrebbe avere alcun effetto insomma).

Ok, grazie mille, mi hai chiarito questo dubbio che avevo.

apatriarca ha scritto:Per quanto riguarda la lettura di argomenti da linea di comando, ho sempre utilizzato la libreria argparse in Python. Il tuo metodo non è comunque tecnicamente sbagliato (a parte un errore nello scrivere "!=").

Si, ho visto solo ora che quando ho messo la condizione che il numero di argomenti della riga di comando sia diverso da 3 ho saltato senza accorgermene l'uguale.


Grazie infinitamente per l'aiuto e la pazienza :)
Patterson
Starting Member
Starting Member
 
Messaggio: 8 di 22
Iscritto il: 12/02/2019, 02:14


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite