Lists/Dicts aus einer Textdatei laden?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Lists/Dicts aus einer Textdatei laden?

Beitragvon Markus12 » Mittwoch 7. März 2007, 16:48

Hi,
ich hab eine frage:
ich hab mir ein Telefonbuch gebastelt, in das man einträge speichern kann. Ich kann sie speichern aber nicht laden. Gearbeitet hab ich mit einem dictionairy (mydict={} - sowas)

beim laden gibt es dann die fehlermeldung:

"Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Programme\Python\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "C:\Dokumente und Einstellungen\Markus Naumann\Eigene Dateien\Informatik\Fertige Programme\Tkinter\Telefonbuch\telefonliste.pyw", line 36, in neu
for Name,Nummer in mydict.items():
AttributeError: 'str' object has no attribute 'items' "

weiß das jemand wie man das macht? ^^
MFG

Markus
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Mittwoch 7. März 2007, 17:03

Hi,
Nach der Fehlermeldung schätze ich mal, dass du die Datei liest, und dann sofort darauf zugreifst? Du musst aus der Zeichenkette erstmal ein Dictionary machen. Entweder mit eval(), oder mit mit dem Modul pickle, wobei du die Daten dann auch damit abspeichern musst.
Gruß, jj
BlackJack

Beitragvon BlackJack » Mittwoch 7. März 2007, 17:05

Nun die Fehlermeldung sagt schonmal das eine Zeichenkette keine Methode mit dem Namen `items()` hat.

Du hast also wahrscheinlich die Datei als Zeichenkette eingelesen und an den Namen `mydict` gebunden. Mal so geraten weil Du ja keinen Quelltext dazu gezeigt hast.

Das `pickle`-Modul bietet sich immer an, wenn man auf einfache Art und Weise Python-Objekte in Dateien speichern und später wieder herstellen möchte.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Mittwoch 7. März 2007, 17:52

um mal n bissl Licht in die Sache zu bringen:

Code: Alles auswählen

>>> type(file(dateiname, 'r').read()))
<type 'str'>
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Donnerstag 8. März 2007, 15:15

ja stimmt, also hier der Quelltext:

Code: Alles auswählen

[code=]from Tkinter import*
from ScrolledText import*

mydict={}
einträge=0
x='unbelegt'

mydict=type(file('mydict.txt', 'r').read())
datei2=open('einträge.txt','r')
einträge=int(datei2.read())

def check():
        global name,nummer
        name=eingabe_name.get()
        nummer=eingabe_nummer.get()
        if name=='':
                eingabe_name.config(bg='red')
        else:
                eingabe_name.config(bg='white')
        if nummer=='':
                eingabe_nummer.config(bg='red')
        else:
                eingabe_nummer.config(bg='white')

def neu():
        global einträge,x,name,nummer
        check()
        if name!='' and nummer!='':
                name=name.upper()
                datei=open('mydict.txt','w')
                datei2=open('einträge.txt','w')
                l_status.config(text='Speichervorgang erfolgreich!')
                for Name,Nummer in mydict.items():
                        if Name==name:
                                x='belegt'
                if x=='unbelegt':
                        einträge=einträge+1
                        l_einträge.config(text='Einträge = '+str(einträge))
                        l_kontakt.config(text=str(name)+'       :        '+str(nummer))
                        mydict[name]=nummer
                        datei.write(str(mydict))
                        datei2.write(str(einträge))
                x='unbelegt'

def laden():
        global name,nummer
        name=eingabe_name.get()
        nummer=eingabe_nummer.get()
        l_kontakt.config(text='')
        if name=='' and nummer=='':
                l_status.config(text='Mindestangabe: Name oder Nummer!')
        elif name!='' and nummer!='':
                l_status.config(text='Nur Name oder Nummer angeben!')
        elif name!='':
                for Name,Nummer in mydict.items():
                        if name==Name:
                                l_kontakt.config(text=str(Name)+'       :       '+str(Nummer))
                                break
        elif nummer!='':
                for Name,Nummer in mydict.items():
                        if nummer==Nummer:
                                l_kontakt.config(text=str(Name)+'       :       '+str(Nummer))
                                break
       
def alles_laden():
        ausgabe=''
        f2=Tk()
        f2.title('Anzeigen aller Kontakte')
        frame2=Frame(f2,bg='LightsteelBlue',height=400,width=400)
        frame2.pack()
        l_überschrift2=Label(frame2,bg='grey',font=('Arial',14,'bold'),width=20,relief='raised',text='Alles Kontakte:')
        l_überschrift2.place(x=20,y=20)
        ausgabefeld=ScrolledText(frame2,bg='Lavender',font=('Arial',10,'bold'),width=50,height=20)
        for Name,Nummer in mydict:
                ausgabe=ausgabe+str(Name)+(30-len(Name))*' '+':      '+str(Nummer)+'\n'
        ausgabefeld.insert(END,ausgabe)
        ausgabefeld.place(x=20,y=60)
        l_kontakt.config(text='')
       
def alles_loeschen():
        global mydict,einträge
        mydict={}
        einträge=0
        datei=open('einträge.txt','w')
        datei.write(str(einträge))
        datei2=open('mydict.txt','w')
        datei2.write(str(mydict))
        l_einträge.config(text='Einträge = '+str(einträge))
        l_status.config(text='Löschvorgang erfolgreich!')
        l_kontakt.config(text='')

hf=Tk()
hf.title('Telefonliste')
frame1=Frame(hf,bg='PaleGreen',height=400,width=400)
frame1.pack()

l_überschrift=Label(frame1,bg='PaleGreen',font=('Arial',30,'bold'),text='Telefonliste')
l_überschrift.place(x=90,y=20)

l_einträge=Label(frame1,bg='PaleGreen',font=('Arial',12,'bold'))
l_einträge.place(x=140,y=70)
l_einträge.config(text='Einträge = '+str(einträge))

l_name=Label(frame1,bg='grey',font=('Arial',14,'bold'),text='Name:',relief='raised')
l_name.place(x=30,y=100)

eingabe_name=Entry(frame1,width=20,font=('Arial',12,'bold'))
eingabe_name.place(x=50,y=140)

l_nummer=Label(frame1,bg='grey',font=('Arial',14,'bold'),text='Nummer:',relief='raised')
l_nummer.place(x=30,y=190)

eingabe_nummer=Entry(frame1,width=20,font=('Arial',12,'bold'))
eingabe_nummer.place(x=50,y=230)

b_neu=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Neu anlegen!',command=neu)
b_neu.place(x=255,y=120)

b_laden=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Kontakt anzeigen!',command=laden)
b_laden.place(x=255,y=160)

b_alles_laden=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Alles laden!',command=alles_laden)
b_alles_laden.place(x=255,y=200)

b_alles_loeschen=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Alles löschen!',command=alles_loeschen)
b_alles_loeschen.place(x=255,y=240)

l_status=Label(frame1,bg='PaleGreen',width=28,font=('Arial',14,'bold'))
l_status.place(x=30,y=290)

l_kontakt=Label(frame1,bg='PaleGreen',width=30,font=('Arial',13,'bold'))
l_kontakt.place(x=30,y=350)

myphoto=PhotoImage(file='telefon.gif')
L=Label(frame1,image=myphoto)
L.config(width=myphoto.width(), height=myphoto.height())
L.place(x=0,y=0)[/code]


@ nkoehring: was genau bedeutet das type?

Danke im Voraus :D
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 8. März 2007, 15:25

Markus12 hat geschrieben:was genau bedeutet das type?


Da fragt man sich ja, was länger dauert: Die Frage zu schreiben oder einfach mal selber in der Doku nachlesen? ;-)
BlackJack

Beitragvon BlackJack » Donnerstag 8. März 2007, 16:19

@Markus12: Du solltest wirklich das `pickle`-Modul zum speichern und laden benutzen. Und dabei nicht vergessen die Dateien im Binärmodus zu öffnen.

So wie's da jetzt steht speicherst Du die Daten überhaupt nicht, Du öffnest nur Dateien zu schreiben. Ohne sie wieder zu schliessen.

Erst dachte ich die Anzahl der Einträge musst Du nicht in einer extra Datei speichern weil man mit `len()` die Anzahl der Elemente eines Dictionary erfährt, bis ich gesehen habe, dass Du auch "unbelegte" Einträge hast ─ warum machst Du so etwas?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Donnerstag 8. März 2007, 16:34

Oder gleich das shelve-Modul.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Donnerstag 8. März 2007, 20:09

@ BlackJack:
Ja, du hast recht, hab ich vergessen, dass ich die einträgeanzahl nicht extra in eine datei schreiben muss :oops:

Ja, mittlerweile hab ich gemerkt dass man, wenn man die datei nicht schließt, die datei auch nicht verschieben kann.

Was meinst du mit unbelegt?
Meinst du das?

Code: Alles auswählen

for Name,Nummer in mydict.items():
                        if Name==name:
                                x='belegt'
                if x=='unbelegt':
                        einträge=einträge+1
                        l_einträge.config(text='Einträge = '+str(einträge))
                        l_kontakt.config(text=str(name)+'       :        '+str(nummer))
                        mydict[name]=nummer
                        datei.write(str(mydict))
                        datei2.write(str(einträge))
                x='unbelegt'



Oder Dictionairy EInträge? Und wo sind sie? ^^
Danke für die Hilfe! :D
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Donnerstag 8. März 2007, 20:13

@ EyDu:

Da fragt man sich ja, was länger dauert: Die Frage zu schreiben oder einfach mal selber in der Doku nachlesen? Wink


Ja, ich weiß :lol: , aber die Doku ist auf Englisch und ich verstehe es einfach nicht so richtig (die ganze dokumentation) :( ^^

Aber der Tipp war nicht schlecht!
:D
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Freitag 9. März 2007, 11:15

habe ich dich jetzt recht verstanden, dass du einproblem mit pickle hast?

ist ganz einfach, probier mal:

Code: Alles auswählen


dict = { ... }

# schreiben ...

output = open('data.pkl', 'wb')
pickle.dump(dict, output)
output.close()

# ... und lesen

input = open('data.pkl', 'rb')
data1 = pickle.load(input)

Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Freitag 9. März 2007, 15:25

habe ich dich jetzt recht verstanden, dass du einproblem mit pickle hast?


@Dill:

Vielen Dank! Es hat funktioniert! :lol:
( Du hast es richtig verstanden :wink: ^^)
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Freitag 9. März 2007, 15:34

schön :)

ich weis ja nicht, wie ernsthaft du dich mit der programmierung auseinandersetzen willst, aber um englisch kommst du dabei eigentlich nicht rum.

das schöne ist, dass man zum lesen von fachliteratur eigentlich nur vokabeln braucht. und das ist ja gerade am computer einfach: du nimmst dir ein tool wie babylon her und hast mit einem click die übersetzung eines englischen wortes.
am anfang ist das natürlich noch etwas anstrengend, geht aber immer besser.
ich komme inzwischen besser mit englischen büchern zurecht als mit deutschen, da vor allem die amerikaner nicht soviel wert darauf legen wie deutsche fahcexperten möglichst komplizierte sätze zu bauen. :)
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main
Kontaktdaten:

Beitragvon Markus12 » Freitag 9. März 2007, 16:30

Das mit dem Pickel funktioniert
Ich habe wieder einmal ein problem:

Wenn ich mein Programm aufrufe und alles anzeigen möchte klappt alles, aber wenn ich einen Kontakt hinzugefügt habe, dann kann öffnet er alle Kontakte nicht mehr mit einer Fehlermeldung

:?

Fehlermeldung:

File "C:\Dokumente und Einstellungen\Markus Naumann\Eigene Dateien\Informatik\Fertige Programme\Tkinter\Telefonbuch\telefonliste.pyw", line 74, in alles_laden
for Name,Nummer in mydict.items():
AttributeError: 'NoneType' object has no attribute 'items'


Also das ist der Quelltext bis jetzt:

Code: Alles auswählen

from Tkinter import*
from ScrolledText import*
import pickle

mydict={}
einträge=0
x='unbelegt'

datei=open('mydict.pkl','rb')
mydict=pickle.load(datei)
einträge=len(mydict)

def check():
        global name,nummer
        name=eingabe_name.get()
        nummer=eingabe_nummer.get()
        if name=='':
                eingabe_name.config(bg='red')
        else:
                eingabe_name.config(bg='white')
        if nummer=='':
                eingabe_nummer.config(bg='red')
        else:
                eingabe_nummer.config(bg='white')

def neu():
        global name,nummer,mydict,einträge,x
        check()
        if name!='' and nummer!='':
                name=name.upper()
                for Name,Nummer in mydict.items():
                        if Name==name:
                                x='belegt'
                if x=='unbelegt':
                        einträge=einträge+1
                        mydict[name]=nummer
                        datei=open('mydict.pkl','wb')
                        mydict=pickle.dump(mydict,datei)
                        datei.close()
                        l_einträge.config(text='Einträge = '+str(einträge))
                        l_kontakt.config(text=str(name)+'       :        '+str(nummer))
                        l_status.config(text='Speichervorgang erfolgreich!')
                x='unbelegt'

def laden():
        global name,nummer
        name=eingabe_name.get()
        nummer=eingabe_nummer.get()
        l_kontakt.config(text='')
        if name=='' and nummer=='':
                l_status.config(text='Mindestangabe: Name oder Nummer!')
        elif name!='' and nummer!='':
                l_status.config(text='Nur Name oder Nummer angeben!')
        elif name!='':
                for Name,Nummer in mydict.items():
                        if name==Name:
                                l_kontakt.config(text=str(Name)+'       :       '+str(Nummer))
                                break
        elif nummer!='':
                for Name,Nummer in mydict.items():
                        if nummer==Nummer:
                                l_kontakt.config(text=str(Name)+'       :       '+str(Nummer))
                                break
       
def alles_laden():
        ausgabe=''
        f2=Tk()
        f2.title('Anzeigen aller Kontakte')
        frame2=Frame(f2,bg='LightsteelBlue',height=400,width=400)
        frame2.pack()
        l_überschrift2=Label(frame2,bg='grey',font=('Arial',14,'bold'),width=20,relief='raised',text='Alles Kontakte:')
        l_überschrift2.place(x=20,y=20)
        ausgabefeld=ScrolledText(frame2,bg='Lavender',font=('Arial',10,'bold'),width=50,height=20)
        for Name,Nummer in mydict.items():
                ausgabe=ausgabe+str(Name)+(30-len(Name))*' '+':      '+str(Nummer)+'\n'
        ausgabefeld.insert(END,ausgabe)
        ausgabefeld.place(x=20,y=60)
        l_kontakt.config(text='')
       
def alles_loeschen():
        global mydict,einträge
        mydict={}
        einträge=0
        data='(dp0','\n','.'
        datei=open('mydict.pkl','w')
        datei.write(str(data))
        datei.close()
        l_einträge.config(text='Einträge = '+str(einträge))
        l_status.config(text='Löschvorgang erfolgreich!')
        l_kontakt.config(text='')

hf=Tk()
hf.title('Telefonliste')
frame1=Frame(hf,bg='PaleGreen',height=400,width=400)
frame1.pack()

l_überschrift=Label(frame1,bg='PaleGreen',font=('Arial',30,'bold'),text='Telefonliste')
l_überschrift.place(x=90,y=20)

l_einträge=Label(frame1,bg='PaleGreen',font=('Arial',12,'bold'))
l_einträge.place(x=140,y=70)
l_einträge.config(text='Einträge = '+str(einträge))

l_name=Label(frame1,bg='grey',font=('Arial',14,'bold'),text='Name:',relief='raised')
l_name.place(x=30,y=100)

eingabe_name=Entry(frame1,width=20,font=('Arial',12,'bold'))
eingabe_name.place(x=50,y=140)

l_nummer=Label(frame1,bg='grey',font=('Arial',14,'bold'),text='Nummer:',relief='raised')
l_nummer.place(x=30,y=190)

eingabe_nummer=Entry(frame1,width=20,font=('Arial',12,'bold'))
eingabe_nummer.place(x=50,y=230)

b_neu=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Neu anlegen!',command=neu)
b_neu.place(x=255,y=120)

b_laden=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Kontakt anzeigen!',command=laden)
b_laden.place(x=255,y=160)

b_alles_laden=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Alles laden!',command=alles_laden)
b_alles_laden.place(x=255,y=200)

b_alles_loeschen=Button(frame1,bg='Chartreuse',font=('Arial',10,'bold'),width=15,text='Alles löschen!',command=alles_loeschen)
b_alles_loeschen.place(x=255,y=240)

l_status=Label(frame1,bg='PaleGreen',width=28,font=('Arial',14,'bold'))
l_status.place(x=30,y=290)

l_kontakt=Label(frame1,bg='PaleGreen',width=30,font=('Arial',13,'bold'))
l_kontakt.place(x=30,y=350)

myphoto=PhotoImage(file='telefon.gif')
L=Label(frame1,image=myphoto)
L.config(width=myphoto.width(), height=myphoto.height())
L.place(x=0,y=0)
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Freitag 9. März 2007, 16:48

fehlt in zeile 34 nicht eine einrückung?

der fehler liegt in zeile 38.
pickle.dump gibt None zurück, daher ist ab jetzt mydict None!

du solltest auch nicht bei jedem update serialisieren, mach das wenn du das programm beendest.
was hast du vor mit dem programm, wo soll es eingesetzt werden?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder