Liste mit Objekten speichern...

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.
Antworten
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Sonntag 24. September 2006, 21:08

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.
Gruß!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 24. September 2006, 21:30

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Sonntag 24. September 2006, 21:31

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 24. September 2006, 21:36

Hi C4S3!

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

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Sonntag 24. September 2006, 21:39

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?
Gruß!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 24. September 2006, 21:58

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 :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 24. September 2006, 23:04

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.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Montag 25. September 2006, 10:54

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
Gruß!
Antworten