Pickle: Einlesen einer serialisierten Liste
Verfasst: Freitag 10. März 2006, 13:18
Hallo zusammen!
Ich benutze pickle bzw. cPickle eigentlich schon nen Weilchen und dachte, man würde einfach einmal die "load"-Methode benutzen, um ein serialisiertes Objekt aus einer Datei zu lesen.
Aber nun hab ich folgendes Verhalten festgestellt:
Wenn ich also einmal load aufrufe, wird mir eine Liste mit einem Element geliefert, bei den nächsten Aufrufen werden dann die fehlenden Einträge der Liste mit eingefügt. Pro Aufruf ein Listen-Element...
Ist das so gewollt? Hab in der Doku nichts dazu gelesen. Vielleicht hab ich aber auch Tomaten auf den Augen - oder so...
Kennt das Problem jemand? Vielleicht noch ein Detail: Ich serialisiere meine Liste mit dem Protokoll 2 (also binär und mit Python 2.4.1) und verwendet beim öffnen der Datei "wb+".
Hab's auch schon mal mit einem String probiert. Also quasi über Protokoll 0 serialisiert und dann den String eingelesen und pickle.loads(s) aufgerufen --> Gleiches Problem!
Vielen Dank und Grüße aus Bremen,
Chris
Ich benutze pickle bzw. cPickle eigentlich schon nen Weilchen und dachte, man würde einfach einmal die "load"-Methode benutzen, um ein serialisiertes Objekt aus einer Datei zu lesen.
Aber nun hab ich folgendes Verhalten festgestellt:
Code: Alles auswählen
>>> import cPickle
>>> f = file("/Library/Application Support/ChrisSek/Report.p", "rb+")
>>> cPickle.load(f)
[{'Action': 'ActionMove', 'ArgDict': {'source': u'/Volumes/Test HD/Src',
'destination': u'/Volumes/Test HD/Desti'}, 'Type': 0, 'Key':
'CoreMsgStart', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)}]
>>> cPickle.load(f)
[{'Action': 'ActionMove', 'ArgDict': {'source': u'/Volumes/Test HD/Src',
'destination': u'/Volumes/Test HD/Desti'}, 'Type': 0, 'Key':
'CoreMsgStart', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)},
{'Action': 'ActionMove', 'ArgDict': {'source': u'/Volumes/Test HD/Src'},
'Type': 1, 'Key':
'CoreMsgMoveSourceEmpty', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)}]
>>> cPickle.load(f)
[{'Action': 'ActionMove', 'ArgDict': {'source': u'/Volumes/Test HD/Src',
'destination': u'/Volumes/Test HD/Desti'}, 'Type': 0, 'Key':
'CoreMsgStart', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)},
{'Action': 'ActionMove', 'ArgDict': {'source': u'/Volumes/Test HD/Src'},
'Type': 1, 'Key':
'CoreMsgMoveSourceEmpty', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)},
{'Action': '', 'ArgDict': {'source': u'/Volumes/Test HD/Src'},
'Type': 0, 'Key':
'CoreMsgEnd', 'Time': (2006, 3, 10, 13, 0, 31, 4, 69, 0)}]
>>> cPickle.load(f)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
EOFError
Ist das so gewollt? Hab in der Doku nichts dazu gelesen. Vielleicht hab ich aber auch Tomaten auf den Augen - oder so...
Kennt das Problem jemand? Vielleicht noch ein Detail: Ich serialisiere meine Liste mit dem Protokoll 2 (also binär und mit Python 2.4.1) und verwendet beim öffnen der Datei "wb+".
Hab's auch schon mal mit einem String probiert. Also quasi über Protokoll 0 serialisiert und dann den String eingelesen und pickle.loads(s) aufgerufen --> Gleiches Problem!
Vielen Dank und Grüße aus Bremen,
Chris