Seite 1 von 1

Liste mit Objekten speichern...

Verfasst: Sonntag 24. September 2006, 21:08
von C4S3
Hallo erstmal!
Ich habe vor kurzem zu Python gewechselt und muss sagen, dass mir die Sprache sehr gut gefällt. Jetzt mach ich meine ersten Gehversuche und arbeite mich unter anderem durch "Byte of Python" (was mir übrigens auch sehr gut gefällt).

Nun habe ich folgende Frage(n):
ich habe mir eine kleine Klasse geschrieben, die "Personen" verwalten soll. Als Datenfelder habe ich nur Name und Alter. Die Instanzen habe ich dann in eine Liste übergeben. Das funktioniert auch wunderbar.
Nun möchte ich die Liste (bzw. deren Objekte) speichern und später wieder auslesen. Nach allem, was ich so gelesen habe, dürfte "pickle" wohl die richtige Wahl sein.
Nur leider funktioniert es nicht so wie ich es mir vorstelle. Deswegen meine Bitte um Rat/Hilfe.

Hier mein Listing.

Code: Alles auswählen

>>> class Person(object):
	def __init__(self, name, alter):
		self.name = name
		self.alter = alter

		
>>> p1 = Person("case", 27)
>>> p2 = Person("mik", 28)
>>> alist = [p1, p2]
>>> print alist
[<__main__.Person object at 0xb765116c>, <__main__.Person object at 0xb765112c>]
>>> for element in alist:
	print element.name, element.alter

	
case 27
mik 28
>>>import pickle
>>> bfile = file("case.txt", "w")
>>> for element in alist:
	dump(element, bfile)

	
>>> bfile.close()
Der "Dump" der Objekte in die Datei funktioniert hier also ganz gut. Soweit ich das diversen Docs entnehmen konnte, ist es normal, dass Python da die Daten in einer "Bytefolge" (? stimmt das so ?) abspeichert.

Wie muss ich nun aber vorgehen, wenn ich die Daten zu einem späteren Zeitpunkt wieder laden möchte? Irgendwie habe ich da Schwierigkeiten.

Bin um jeden Tip dankbar.
Dankeschön.

Re: Liste mit Objekten speichern...

Verfasst: Sonntag 24. September 2006, 21:30
von Leonidas
Hallo C4S3, willkommen im Forum!
C4S3 hat geschrieben:Wie muss ich nun aber vorgehen, wenn ich die Daten zu einem späteren Zeitpunkt wieder laden möchte? Irgendwie habe ich da Schwierigkeiten.
Das geht so:

Code: Alles auswählen

import pickle
obj = object()
f = file('dump.pickle', 'w')
pickle.dump(obj, f)
f.close()
#und öffnen
f = file('dump.pickle', 'r')
obj = pickle.load(f)
f.close()
Du siehst, man kann in Pickle nur ein Objekt auf einmal speichern (also nur einmal dump pro Datei). Aber es hält dich nichts davon ab, eine Liste von Objekten zu speichern.

Verfasst: Sonntag 24. September 2006, 21:31
von CM
Hoi und willkommen im Forum,

eine Alternative zu Leonidas Vorgehensweise findest Du hier:
http://www.python-forum.de/topic-2845.html
Die Funktion kann man natürlich auf auch Listen dieser Objekte anwenden.

Gruß,
Christian

Verfasst: Sonntag 24. September 2006, 21:36
von gerold
Hi C4S3!

Hier habe ich auch noch ein wenig Lesestoff für dich:
http://www.python-forum.de/post-37898.html

mfg
Gerold
:-)

Verfasst: Sonntag 24. September 2006, 21:39
von C4S3
Danke euch beiden für die prompte Antwort! :shock:
Das ist ja quasi "Help Desk Expresszustellung"!
Also herzlichen Dank nochmal!

Ist mit dem einen Dump pro Datei auch nur ein Objekt gemeint? Wahrscheinlich, dies würde zumindest meine missglückten Versuche erklären, die Objekte wieder zu laden. Aber ich könnte ja für jedes Objekt in der Liste eine separate Datei anlegen. Mich würde das nicht stören und möglich wär's ja auch.
Somit könnte ich die Objekte/Dateien zu einem späteren Zeitpunkt ganz einfach wieder laden und in eine Liste wieder einfügen, bzw. an eine bestehende anhängen!
(oder habe ich das jetzt was falsch verstanden? :oops: )

EDIT:: Mist, zu langsam! Danke natürlich auch dir, gerold. Der Link ist auf jeden Fall interessanter Lesestoff.

EDIT 2:: Mein Gott, bin ich dämlich.
gerolds link hat geschrieben:

Code: Alles auswählen

f = file("dateiname.bin", "wb")
pickle.dump(personen, f)
f.close()

# Lesen
f = file("dateiname.bin", "rb")
personen = pickle.load(f)
f.close()
print personen
Da hätte ich anstatt jedes Objekt der List zu "dumpen", die ganze Liste, die ja auch ein Objekt ist, dumpen können, oder?

Verfasst: Sonntag 24. September 2006, 21:50
von BlackJack
Genau. :-)

Verfasst: Sonntag 24. September 2006, 21:58
von Leonidas
C4S3 hat geschrieben:Da hätte ich anstatt jedes Objekt der List zu "dumpen", die ganze Liste, die ja auch ein Objekt ist, dumpen können, oder?
Exakt. Das ist das tolle: man denkt kompliziert, aber es stellt sich als viel einfacher heraus. War bei mir damals, als ich pickle entdeckte, auch der Fall :)

Verfasst: Sonntag 24. September 2006, 23:04
von Y0Gi
Oder anders: Du kannst pro Datei den Inhalt genau einer Variablen dumpen. Ob das jetzt eine Zahl, ein eigenes Objekt oder eine multidimensionale Verschachtelung von Listen, Dictionaries und eigenen Objekten, die vielleicht auch noch diese Strukturen verwenden/davon ableiten, ist, ist schnuppe.

Verfasst: Montag 25. September 2006, 10:54
von C4S3
Danke euch noch mal. Habe jetzt alles ausprobiert und es funktioniert.

:D

Das Beste daran ist: ich muss im Moment fragen, nicht weil Python zu kompliziert ist, sondern weil ich erst wieder lernen muss, so "einfach" zu denken.

Diese Sprache ist ja genial!

Python muss man ja "nur sagen", was es tun soll, nicht wie...
Wow!

:D