Seite 1 von 1

serialisieren

Verfasst: Donnerstag 17. November 2011, 09:52
von thomes
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

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 10:00
von mutetella
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

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 10:09
von 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.

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 10:37
von thomes
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]

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 10:41
von thomes
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

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 17:23
von thomes
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

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 20:26
von 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.

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 20:33
von mutetella
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

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 20:37
von thomes
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.

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 21:03
von thomes
...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.

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 22:02
von 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.

Re: serialisieren

Verfasst: Donnerstag 17. November 2011, 22:09
von thomes
Sorry, hatte ich voellig verdusselt.

Beste Grüße
Thomes