{'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.
Telefonbuch aus byte of Python
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.
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()
@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.

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.
@BlckJack: Woran das lag war mir halbwegs klar, leider kannte ich keine Lösung für das Problem.BlackJack hat geschrieben:@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
@cofi: Hast du dir das so vorgestellt:
Code: Alles auswählen
personsfile = 'persons.data'
f = open(personsfile, 'rb')
storedpersons = pickle.load(f)
persons = {storedpersons}
File "dict.py", line 8, in <module>
persons = {storedpersons}
TypeError: unhashable type: 'dict'
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nein, so hab ich mir das nicht vorgestellt.
Dictionary-Literale sehen so aus `{key : value}`.
Es reicht wenn du dein Snippet so änderst:
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)