Pagina 1 di 1

Dizionario di Python

Inviato: giovedì 3 maggio 2012, 23:33
da -Massimo-
Salve, sono nuovo, mi chiamo Massimo ed ho 14 anni. Da poco ho iniziato a programmare e devo dire che il Python è il più facile rispetto ad altri.
Il mio problema risale in un programma che usa un dizionario: QUANDO RIAVVIO IL PROGRAMMA NON RICORDA PIù I RECORD INSERITE PRECEDENTEMENTE. :incazz:

ESEMPIO.

avvio il programma, aggiungo in nome, esso è presente, ma se riavvio il programma ritrovo quelli già scritti nel dizionario

# programma dizionario.py

Codice: Seleziona tutto

diz = {"massimo":"tel: 99999999","alberto":"tel: 33333333","simone":"tel: 02416448564565"}

import time

while (1):

	print "******************************************************************"
	print " * cerca nome",
	print "* elenca nomi",
	print "* aggiungi nome",
	print "* elimina nome",
	print "* esci"
	print "******************************************************************"
	print

	a=raw_input("Inserire comando\t")
	if a=="cerca nome":
		try:
			a=raw_input("Inserire nome\n")
			print
			print diz[a]
			time.sleep(2.2)
			print '\n' *50
		except:
			print "nome errato o non presente"
			time.sleep(2.2)
			print '\n' *50

	elif a=="elenca nomi":
		print
		print diz.keys()
		time.sleep(2.2)
		print '\n' *50

	elif a=="aggiungi nome":
		b=raw_input("Inserire key\t")
		c=raw_input("Inserire value\t")
		diz [b]=[c]
		time.sleep(1)
		print "nome aggiunto"
		time.sleep(2.2)
		print '\n' *50
	elif a=="elimina nome":
		v=raw_input("Inserire chiave da eliminare\t")
		del diz[v]
		print "Nome eliminato!"
		time.sleep(2.2)
		print '\n' *50
	elif a=="esci":
		exit()
	else:
		print "Errore!"
		time.sleep(2.2)
		print '\n' *50

Re: Dizionario di Python

Inviato: giovedì 3 maggio 2012, 23:36
da Zoff
È normale, se vuoi che se le ricordi devi salvare il dizionario su file e ricaricarlo all'avvio.

Modifica anche il messaggio precedente aggiungendo i tag

Re: Dizionario di Python

Inviato: venerdì 4 maggio 2012, 0:22
da crap0101
butta un occhio qua: http://docs.python.org/library/pickle.h ... ule-pickle

ah... usa il tag

Codice: Seleziona tutto

codice
quando posti codice, altrimenti perde la formattazione.

Re: Dizionario di Python

Inviato: venerdì 4 maggio 2012, 15:13
da -Massimo-
crap0101 ha scritto:butta un occhio qua: http://docs.python.org/library/pickle.h ... ule-pickle

ah... usa il tag

Codice: Seleziona tutto

codice
quando posti codice, altrimenti perde la formattazione.
FATTO !!!!

Re: Dizionario di Python

Inviato: sabato 5 maggio 2012, 8:07
da Bakuriu
Secondo me il metodo più rapido per fare quello che vuoi è utilizzare il modulo "shelve".
A “shelf” is a persistent, dictionary-like object. The difference with “dbm” databases is that the values (not the keys!) in a shelf can be essentially arbitrary Python objects — anything that the pickle module can handle. This includes most class instances, recursive data types, and objects containing lots of shared sub-objects. The keys are ordinary strings.

Re: [RISOLTO]Dizionario di Python

Inviato: sabato 5 maggio 2012, 23:10
da Aladino70
Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie

Re: Dizionario di Python

Inviato: sabato 5 maggio 2012, 23:48
da Alkatron
Aladino70 ha scritto:Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie

Codice: Seleziona tutto

import shelve
def shvsave(_dict, _name):
    db = shelve.open(_name,"n")
    db['dati'] = _dict
    db.close()
def shvread(_name):
    db = shelve.open(_name,"r") 
    _ret=db['dati']
    db.close()
    return _ret
def main():
    mydict = {}
    b = ''
    while b != "exit":
        b=raw_input("Chiave... ")
        if b =='save':
            shvsave(mydict, 'shvfile.shv')
            break
        elif b =='read':
            mydict=shvread('shvfile.shv')
            for key, val in mydict.iteritems():
                print '%s - %s' % (key,val)
            break    
        c=raw_input("Valore... ")
        mydict[b] = c
    print b
    return 0
if __name__ == '__main__':
	main()
Se a Chiave dai
'exit' esce
'save' salva
'read' legge i dati precedentemente salvati

Re: Dizionario di Python

Inviato: domenica 6 maggio 2012, 0:19
da Aladino70
Scusa ma per me è importantissimo. Sono un novizio,entusiasta ma novizio. In generale mi è chiara ma: key, val, _name, 'dati',_dict,_ret, vado nel panico!
key e value sonno le variabili ma se sono d e c. In poche parole io dopo mydict, b e c non saprei che mettere. Si vede che sono confuso o sbaglio?

Re: Dizionario di Python

Inviato: domenica 6 maggio 2012, 8:56
da Bakuriu
Alkatron ha scritto:
Aladino70 ha scritto:Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie

Codice: Seleziona tutto

import shelve
def shvsave(_dict, _name):
    db = shelve.open(_name,"n")
    db['dati'] = _dict
    db.close()
def shvread(_name):
    db = shelve.open(_name,"r") 
    _ret=db['dati']
    db.close()
    return _ret
def main():
    mydict = {}
    b = ''
    while b != "exit":
        b=raw_input("Chiave... ")
        if b =='save':
            shvsave(mydict, 'shvfile.shv')
            break
        elif b =='read':
            mydict=shvread('shvfile.shv')
            for key, val in mydict.iteritems():
                print '%s - %s' % (key,val)
            break    
        c=raw_input("Valore... ")
        mydict[b] = c
    print b
    return 0
if __name__ == '__main__':
	main()
Se a Chiave dai
'exit' esce
'save' salva
'read' legge i dati precedentemente salvati
Ma che senso ha usare shelve se poi di fatto non lo sfrutti? Per fare una cosa di questo tipo pickle sarebbe più consono.
Se utilizzi shelve devi utilizzarne la sua interfaccia dict-like:

Codice: Seleziona tutto

def main():
    mydict = shelve.open('db.shelve', 'c')   #c = apri database per lettura + scrittuare, e crealo se non esiste
    while True:
        b=raw_input("Chiave... ")
        if b =='exit':
            mydict.sync()    #salva i risultati ed esce
            break
        elif b == 'save':
            mydict.sync()
            continue
        c=raw_input("Valore... ")
        mydict[b] = c
    mydict.close()
if __name__ == '__main__':
	main()
edit:
comunque il codice postato in precedenza non funzionava perchè apriva il db con la flag "n" che crea sempre un nuovo db.
Bisogna usare "c"!

Re: Dizionario di Python

Inviato: lunedì 7 maggio 2012, 0:06
da Aladino70
scusa ma continua a non funzionarmi...sono io che non riesco:
tolgo def main(): ed inserisco il codice direttamente
inoltre elimino if__name__=="__main__": e main() perchè non capisco a che servono.
Adesso il programma mi salta a piè uniti tutto il codice e salta alla fine ma perchè?
Se vuoi ti spiego meglio: è un prog di intelligenza artificiale che sfrutta un dizionario.
Ho provato ad inserire all'interno del mio codice le righe di codice che mi hai suggerito e salta.
Che faccio? di posto tutto il programma?

Re: Dizionario di Python

Inviato: lunedì 7 maggio 2012, 0:48
da Aladino70
Eureka!!! Ci sono riuscito e tutto funziona perfettamente. Grazie sinceramente a tutti.
Ho fatto così:

Codice: Seleziona tutto

b="inizio"
while b!="":
      mydict = shelve.open("db.shelve","c")
      voce.Speak("Chiedimi qualcosa")
      b=raw_input("Chiedimi qualcosa... ")
      if b=="exit":
        mydict.sync()
        break
      elif b =="save":
         mydict.sync()
         continue
      elif mydict.has_key(b):
        print mydict[b]
        voce.Speak(mydict[b])
      else:
         voce.Speak("Non capisco, cosa DovrEi Rispondere alla Domanda...")
         c=raw_input("Non capisco, cosa dovrei rispondere alla domanda..."+b)
         mydict[b]=c
         mydict.close()
         print"La risposta è ",c,"giusto?",nome
         voce.Speak("La risposta è")
         voce.Speak(c)
         voce.Speak("Giusto?")
         voce.Speak(nome)
era semplice anche se mi ha fatto mangiare bug in quantità. Grazie.

Re: Dizionario di Python

Inviato: lunedì 7 maggio 2012, 11:04
da Bakuriu
Aladino70 ha scritto:scusa ma continua a non funzionarmi...sono io che non riesco:
tolgo def main(): ed inserisco il codice direttamente
inoltre elimino if__name__=="__main__": e main() perchè non capisco a che servono.
Adesso il programma mi salta a piè uniti tutto il codice e salta alla fine ma perchè?
Se vuoi ti spiego meglio: è un prog di intelligenza artificiale che sfrutta un dizionario.
Ho provato ad inserire all'interno del mio codice le righe di codice che mi hai suggerito e salta.
Che faccio? di posto tutto il programma?
A me funziona.
Comunque è una pessima idea mettere del codice a livello del modulo. Ti potresti chiedere perchè... la risposta è semplice: ti potrebbe sempre venir voglia di riutilizzare quel codice in un altro programma, ma se cerchi di importare il modulo il codice viene eseguito. Se invece utilizzi una funzione main e quell'if sei a posto.

In pratica:

Codice: Seleziona tutto

 if __name__ == '__main__': 
Significa: "se questo modulo è stato eseguito e non importato".
È una convenzione che viene utilizzata da tutti, quindi comincia a seguirla anche tu.

Per quanto riguarda il tuo codice, io cambierei un sacco di cose:

1) Tu riapri il dizionario shelve ad ogni ciclo! ma nel momento in cui questo dizionario conterrà migliaia di valori vedrai che questa riapertura si noterà.
Visto che è inutile aprilo al di fuori del ciclo.

2) Ogni volta usi questo "voce.Speak" e raw_input oppure print e "voce.Speak".. ma a questo punto sarebbe molto più chiaro crearsi una funzione a parte, tipo "output" e "get_input".

3) Ti sconsigio di utilizzare "has_key". Utilizza l'operatore "in"(al posto di "mydict.has_key(b)" usa "b in mydict")


Sostanzialmente io modificherei il tutto così:

Codice: Seleziona tutto

def output(msg, voce=None):
    '''Prints some output text.
    If *voce* is provided than it is also used to send some
    sound output.
    '''
    
    print msg
    if voce is not None:
        voce.Speak(msg)

def get_input(prompt, voce=None, end=''):
    '''Return an input string.
    If *voce* is provided the prompt is also spoken.
    '''
    
    if voce is not None:
        voce.Speak(prompt)
    return raw_input(prompt + end)


def main():
    mydict = shelve.open('db.shelve', 'c')

    while True:
        question = get_input('Chiedimi qualcosa', voce,'...')
        if question == "exit":
            break
        elif question == "save":
            mydict.sync()
            continue
        elif question in mydict:
            output(mydict[question], voce)
        else:
            answer = get_input('Non capisco, cosa dovrei rispondere alla domanda...',
                               voce, question)
            mydict[question] = answer
            mydict.sync()
            output('La risposta è %s giusto?' % answer, voce)
    mydict.close()