Seite 2 von 2

Verfasst: Freitag 22. Mai 2009, 17:54
von Cenz
{'dfs': <__main__.Person object at 0x7f0c408bef90>}

So sieht die Ausgabe aus, wenn ich das geändert habe. dfs ist die Person die ich eingegeben habe.

Verfasst: Freitag 22. Mai 2009, 18:59
von cofi
Das ist es doch aber auch.
Wenn du etwas lesbares willst, solltest du dir Rebeccas Post noch einmal anschauen.

Verfasst: Freitag 22. Mai 2009, 19:43
von Cenz
Habe ich jetzt auch probiert, ich bekam wieder Fehlermeldungen.

Allerdings habe ich jetzt versucht ein Telefonbuch ohne Klassen zu programmieren.
Mein Problem ist allerdings das es nur eine Person speichert, nicht mehr.
Leider steht in Byte of Python nicht drin, wie man dieses Problem löst.
Es wäre schön wenn mir da jemand helfen könnte.

Code: Alles auswählen

#/usr/bin/python
#Filename: xfonbuch.py
import pickle

personsfile = 'persons.data'
persons = {}

def addperson():
	print('hinzufügen')
	name = input('name?')
	number = input('nummer?')
	persons[name] = number
	f = open(personsfile, 'wb')
	pickle.dump(persons, f) # dump the object to a file
	f.close()

	
def delperson():
	print('löschen')
	name = input('name?')
	del persons[name]

def showpersons():
	f = open(personsfile, 'rb')
	storedpersons = pickle.load(f) # load the object from the file
	print(storedpersons)


print('1: hinzufügen')
print('2: löschen')
print('3: zeigen')

do = input('Was möchtest du tun?')


if do == '1':
	addperson()
if do == '2':
	delperson()
if do == '3':
	showpersons()

Verfasst: Freitag 22. Mai 2009, 20:24
von BlackJack
@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.

Verfasst: Freitag 22. Mai 2009, 20:26
von cofi
Das Problem liegt darin, dass du auch nur mit einer Person arbeitest ;)
Konkret heisst das: Du schreibst beim Hinzufügen einer Person die ganze "Datenbank" neu, ohne jedoch die alte überhaupt geladen zu haben.

Die Lösung ist entweder dass du die "Datenbank" im Laufe des Programms im Speicher hälst, dh `persons` zu Beginn mit `pickle.load` initialisierst.

Hat auch den Vorteil, dass du nicht dauernd auf Dateien zugreifen musst. Generell bietet sich aber `shelve` mehr an als `pickle`, da ersteres sich schon wie ein Dictionary verhält und die Sache vereinfacht.

Verfasst: Freitag 22. Mai 2009, 21:06
von Cenz
BlackJack hat geschrieben:@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
@BlckJack: Woran das lag war mir halbwegs klar, leider kannte ich keine Lösung für das Problem.

@cofi: Hast du dir das so vorgestellt:

Code: Alles auswählen

personsfile = 'persons.data'
f = open(personsfile, 'rb')
storedpersons = pickle.load(f)
persons = {storedpersons}
Ich bekomme dann aber das hier als Ausgabe:
File "dict.py", line 8, in <module>
persons = {storedpersons}
TypeError: unhashable type: 'dict'

Verfasst: Freitag 22. Mai 2009, 21:21
von cofi
Nein, so hab ich mir das nicht vorgestellt.
Dictionary-Literale sehen so aus `{key : value}`.

Es reicht wenn du dein Snippet so änderst:

Code: Alles auswählen

personsfile = 'persons.data'
f = open(personsfile, 'rb')
persons = pickle.load(f)

Verfasst: Freitag 22. Mai 2009, 21:25
von Cenz
Danke sehr :D :D :D :D :D :D :D