Telefonbuch aus byte of Python

Code-Stücke können hier veröffentlicht werden.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

{'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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das ist es doch aber auch.
Wenn du etwas lesbares willst, solltest du dir Rebeccas Post noch einmal anschauen.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

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()
BlackJack

@Cenz: Versuch Dir doch mal selber zu erklären warum das so ist. Dann kommst Du da sicher selbst drauf.
Benutzeravatar
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.
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

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'
Benutzeravatar
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:

Code: Alles auswählen

personsfile = 'persons.data'
f = open(personsfile, 'rb')
persons = pickle.load(f)
Cenz
User
Beiträge: 12
Registriert: Donnerstag 21. Mai 2009, 16:02

Danke sehr :D :D :D :D :D :D :D
Antworten