serialisieren

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
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Hi,
per GUI fange ich Benutzereingaben ab und übergebe die Eingaben an ein Objekt.
Das Objekt speichere ich nun in eine Datei.

Nun möchte ich eine neue Benutzereingabe in die Datei speichern, dabei wird mir leider (logischerweise)
meine vorherige Eingabe überschrieben.

Damit die neue Eingabe in der Datei nicht überschrieben, sondern angehängt wird, habe ich folgendes versucht:

Code: Alles auswählen

# Objekte in Liste speichern
liste = []
liste.append(ausgabe)

#Liste in "Datei.txt" schreiben 
pickle.dump(liste, f)
Leider hat das nicht funktioniert. Ich schätze ich brauche ein for-Schleife oder so....ich stehe gerade völlig auf dem Schlauch.
Hat jemand eine Lösung für das Problem?

Danke für Eure Hilfe!

Beste Grüße
Thomes
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

An eine per 'pickle' erzeugte Datei kannst Du nicht einfach etwas anhängen. Kannst Du natürlich schon, wird aber von 'pickle' bestenfalls als neues Objekt interpretiert.

Du musst folgendermaßen vorgehen:
1. Bereits gespeicherte Liste einlesen
2. Objekt an Liste anhängen
3. Liste wieder abspeichern

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo und willkommen im Forum,

leider ist Deine Frage etwas unklar. Vielleicht hilft Dir weiter zu wissen, dass Files Modi haben können und "a" dafür steht Daten anhängen zu können. Wiederholtes Aufrufen von pickle.dump() hat wahrscheinlich nicht den erhofften Effekt, denn neue Daten werden - wenn ich Dich recht verstehe - erst an eine bestehende Liste gehangen, dann serialisiert - und zwar immer wieder neu - und erst mit f.close() (unter der Annahme, daß f Dein Fileobjekt ist) sicher geschrieben.

Interaktiv sähe das so aus:

Code: Alles auswählen

>>> import pickle
>>> f = open('test.txt', 'a')
>>> data = list()
>>> pickle.dump(data, f)
>>> data.append('a')
>>> pickle.dump(data, f)
>>> data.append('b')
>>> pickle.dump(data, f)
>>> f.close()
>>> 
>>> f = open('test.txt', 'r')
>>> pickle.load(f)
[]
>>> pickle.load(f)
['a']
>>> pickle.load(f)
['a', 'b']
Was möchtest Du denn *eigentlich* erreichen? Vielleicht ist pickle ja gar nicht die Lösung? Es gibt schließlich noch

Code: Alles auswählen

mehr unter der Python-Sonne[/code] ;-).

HTH
Christian

PS edit: Zu spät ...
edit2: Und aus dem oben genannten Grund hat 'a' hier auch nicht den Effekt, den man naiverweise annehmen könnte, da das Objekt ja erst mit dem Schließen des Files geschrieben wurde.
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Hi,

vielen Dank für deine Antwort.

Also, ich benötige ein Eingabemaske, welche die einzelnen Eingaben nach klicken eines Buttons in eine Datei speichert.
(Das funktioniert so weit.)
Nun gebe ich in die Eingabemaske erneut was ein und übergebe durch klicken auf "Ok" dem Objekt die neuen Eingaben.
Die neuen Eingaben sollen nun nun auch wieder in die Datei gespeichert werden, jedoch werden die alten Eingaben überschrieben.

Hoffe ich habe mich nun etwas besser ausgedrückt!?

Danke für deine Hilfe.

VG T



[quote="CM"]Hallo und willkommen im Forum,

leider ist Deine Frage etwas unklar. Vielleicht hilft Dir weiter zu wissen, dass Files Modi haben können und "a" dafür steht Daten anhängen zu können. Wiederholtes Aufrufen von pickle.dump() hat wahrscheinlich nicht den erhofften Effekt, denn neue Daten werden - wenn ich Dich recht verstehe - erst an eine bestehende Liste gehangen, dann serialisiert - und zwar immer wieder neu - und erst mit f.close() (unter der Annahme, daß f Dein Fileobjekt ist) sicher geschrieben.

Interaktiv sähe das so aus:

Code: Alles auswählen

>>> import pickle
>>> f = open('test.txt', 'a')
>>> data = list()
>>> pickle.dump(data, f)
>>> data.append('a')
>>> pickle.dump(data, f)
>>> data.append('b')
>>> pickle.dump(data, f)
>>> f.close()
>>> 
>>> f = open('test.txt', 'r')
>>> pickle.load(f)
[]
>>> pickle.load(f)
['a']
>>> pickle.load(f)
['a', 'b']
Was möchtest Du denn *eigentlich* erreichen? Vielleicht ist pickle ja gar nicht die Lösung? Es gibt schließlich noch

Code: Alles auswählen

mehr unter der Python-Sonne[/code] ;-).

HTH
Christian

PS edit: Zu spät ...
edit2: Und aus dem oben genannten Grund hat 'a' hier auch nicht den Effekt, den man naiverweise annehmen könnte, da das Objekt ja erst mit dem Schließen des Files geschrieben wurde.[/quote]
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Hi,

vielen Dank für deinen Tip!

Viele Grüße
Thomas



mutetella hat geschrieben:An eine per 'pickle' erzeugte Datei kannst Du nicht einfach etwas anhängen. Kannst Du natürlich schon, wird aber von 'pickle' bestenfalls als neues Objekt interpretiert.

Du musst folgendermaßen vorgehen:
1. Bereits gespeicherte Liste einlesen
2. Objekt an Liste anhängen
3. Liste wieder abspeichern

mutetella
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Hi mutetella,

nach deiner Anleitung habe ich folgendes gemacht:

Code: Alles auswählen

#Objekte aus Datei lesen und an Liste uebergeben
fileRead = open("Datei.txt", "r")
liste = []
liste = pickle.load(fileRead)
fileRead.close()
 
#neues Objekt an Liste anhaengen und in Datei schreiben 
fileSave = open("Datei.txt", "wb")
liste.append(ausgabe)
pickle.dump(liste, fileSave)
fileSave.close()
Leider klappt das nicht.
Ich bekomme folgende Fehlermeldung:

Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/tkinter/__init__.py", line 1399, in __call__
return self.func(*args)
File "/Users/mac/AgileDev-Project/ALex/AusgabenEingabe.py", line 88, in ok
liste = pickle.load(fileRead)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

Hast Du ne Idee???

Beste Grüße
Thomes

mutetella hat geschrieben:An eine per 'pickle' erzeugte Datei kannst Du nicht einfach etwas anhängen. Kannst Du natürlich schon, wird aber von 'pickle' bestenfalls als neues Objekt interpretiert.

Du musst folgendermaßen vorgehen:
1. Bereits gespeicherte Liste einlesen
2. Objekt an Liste anhängen
3. Liste wieder abspeichern

mutetella
BlackJack

@thomes: `pickle`-Dateien sind Binärdateien und müssen immer im Binärmodus geöffnet werden. Dementsprechend ist die Dateiendung *.txt vielleicht auch etwas irreführend gewählt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

zum Schreiben öffnest Du die Datei, in die 'pickle' hineinschreibt im Binärmodus, zum Lesen allerdings nicht.
Die 'pickle'-Doku sagt:
"When reading a pickle-containing file, you should open the file in binary mode because you can’t be sure if the ASCII or binary format was used."
Du solltest also auch zum Lesen 'rb' als mode übergeben. Unter Python 2 funktioniert meistens auch der Textmodus, unter Python 3 aber geht's dann nur im Binärmodus.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Vielen Dank für den Hinweis!

BlackJack hat geschrieben:@thomes: `pickle`-Dateien sind Binärdateien und müssen immer im Binärmodus geöffnet werden. Dementsprechend ist die Dateiendung *.txt vielleicht auch etwas irreführend gewählt.
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

...das war der Fehler! Danke!

thomes hat geschrieben:Vielen Dank für den Hinweis!

BlackJack hat geschrieben:@thomes: `pickle`-Dateien sind Binärdateien und müssen immer im Binärmodus geöffnet werden. Dementsprechend ist die Dateiendung *.txt vielleicht auch etwas irreführend gewählt.
BlackJack

@thomes: Dein Zitatstil ist sehr ungewöhnlich. Normalerweise schreibt man *unter* das Zitat. Aber man sollte auch nicht einfach immer alles zitieren. Der Text steht ja in den Beiträgen darüber schon, es macht also wenig Sinn den zigfach immer wieder zu kopieren.
thomes
User
Beiträge: 7
Registriert: Donnerstag 17. November 2011, 09:14

Sorry, hatte ich voellig verdusselt.

Beste Grüße
Thomes
Antworten