Problem mit pickle file -> dict appenden geht nicht

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.
nepi
User
Beiträge: 23
Registriert: Montag 23. Juni 2008, 11:26

Problem mit pickle file -> dict appenden geht nicht

Beitragvon nepi » Mittwoch 16. Juli 2008, 18:09

hallo..

ich benutze ein pickle file um daten zu speichern (dictChecksum). Das script läuft jeden Tag.. ich möchte gerne am Ende eines Tages die neuen Werte (dictNewChecksum) an das pickle file appenden. Da das Script gleichzeitig auf mehreren Rechnern läuft muss ich es appenden anstatt zu überschreiben, da ich ansonsten Werte verlieren könnte.

Nach dem appenden, sehe ich im *.pkl file die neuen Werte. Weiss das es binary ist, aber checksum werte sind ja ersichtlich da sie (bei mir) hexadezimal sind. ABER wenn ich das pickle file lade, und den dict printe, sehe ich nur die alten werte, die neuen hinzugefügten sind nicht da...

Hinzufügen zum neuen dict:

Code: Alles auswählen

ch = meineChecksumme
self.checksumNewDict[ch] = {"lastIns":int(time.time()),"sysId":sysId}


Laden des pickl files:

Code: Alles auswählen

            fp = open(self.checksumFilePath, "rb")
            self.checksumDict = pickle.load(fp)


Schreiben des pickle files am Ende:

Code: Alles auswählen

            fp = open(self.checksumFilePath, "ab")
            print "@@@@@@", self.checksumNewDict
            pickle.dump(self.checksumNewDict, fp)
            fp.close()


Woran kann es liegen?? 'ab' gibt es ja, sonst würde ich im pickle File die neue checksumme ja nicht sehen... es scheint, als würde das neue dict in ein unterelement des normalen dict degradiert werden und somit nicht mehr lesbar für den pickle parser..
hoffe ich habe nichts offensichtliches übersehen....
Zuletzt geändert von nepi am Mittwoch 16. Juli 2008, 19:42, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 16. Juli 2008, 19:04

Pickel kann nicht auf irgend eine magische Weise von Variablennamen in deinem Programm auf den Inhalt in der Datei schließen, dass musst du schon selber erledigen. So wie du es gerade machst, hängst du einfach ein weiteres Objekt ans Ende der Datei rand (mach einfach mal ein zweites pickle.load(fp)). Wenn du das Dictionary aktualisieren willst, dann musst du es erst laden und dann komplett in der Datei überschreiben.
BlackJack

Beitragvon BlackJack » Mittwoch 16. Juli 2008, 19:25

@nepi: Das anhängen löst Dein Problem nicht. Wenn mehrere Programme versuchen gleichzeitig etwas an die Datei an zu hängen, kann auch Datenmüll dabei heraus kommen.

Das einfachste wäre in diesem Fall eine Datenbank bevor Du anfängst Dir sichere Transaktionen selbst zu programmieren.
nepi
User
Beiträge: 23
Registriert: Montag 23. Juni 2008, 11:26

Beitragvon nepi » Mittwoch 16. Juli 2008, 19:52

EyDu hat geschrieben:So wie du es gerade machst, hängst du einfach ein weiteres Objekt ans Ende der Datei rand (mach einfach mal ein zweites pickle.load(fp)).

Genau das will ich ja, das checksumNewDict anhängen. Du sagst ich hänge es einfach an, aber wenn ich in einem 2. Durchgang das script laufen lasse, erhalte ich das Ursprungsdict zurück und nicht das neue, obwohl ich ja nur das neue dumpe. Scheint mir wie du sagst, dass es nur angehängt wird, aber nicht in der richtigen pickle struktur..

EyDu hat geschrieben:Wenn du das Dictionary aktualisieren willst, dann musst du es erst laden und dann komplett in der Datei überschreiben.

geht es nicht anders? mein problem dabei ist, dass 2 identische scripte auf unterschiedlichen rechners zeitgleich beginnen die checksum aus dem picklefile auszulesen. danach starten die eigentliche aufgaben der scripte... wenn das eine script zu ende ist, schreibt es checksumDict zurück, wenn das 2. script fertig ist, ebenfalls. JEDOCH hat dann durch das 2. script das picklefile die änderungen des 1. scripts verloren, weil beide zuerst den ursprung nehmen und dann alles zurückschrieben -> aus diesem grund möchte ich gerne die daten anhängen.

Eine DB Lösung kommt nur seeehr, seeehr ungern in frage...

@blackjack
Wen du sagst es löst mir mein Problem nicht wegen der Transaktion, gehe ich davon aus, das du eine möglichkeit des anhängens in ein picklefile siehst? :)
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Mittwoch 16. Juli 2008, 19:56

Das mehrer Programme gleichzeitig auf die Datei zugreifen habe ich völlig überlesen. Implementiere es so, wie BlackJack es vorgeschlagen hat, das was du gerade machst kann so nicht sicher funktionieren und alle anderen Lösungen sind aufwändiger.

Wer ist online?

Mitglieder in diesem Forum: martinjo, WhiteyW