Seite 1 von 1

cPickle tut nichts

Verfasst: Montag 9. Juli 2007, 12:53
von uselessuser
Hallo,

ich habe ein Problem mit cPickle. Es soll eine (gigantische, verschachtelte) Liste in eine Datei schreiben. Das passiert allerdings nur manchmal.
Das Verhalten ist voellig unreproduzierbar. Hier der Code:

Code: Alles auswählen

import sys, cPickle

def object_to_file(object, filename):
	try:
		stream = open(filename, 'w')
		cPickle.dump(object, stream)
		stream.close()
	except IOError:
		print 'ERROR: Cannot write to file', filename
Und der Aufruf:

Code: Alles auswählen

try:
	object_to_file(vectors, 'vectors.' + string + '.pydat')
except:
	print '...but I didn\'t'
Manchmal erstellt der die Datei (string ist eben ein String), manchmal nicht. Ausgeben tut er nie irgendetwas.

Was mache ich falsch?

Verfasst: Montag 9. Juli 2007, 13:14
von HWK
Dateien für Pickle sollten im Mode 'wb' geöffnet werden.
'object' sollte wie alle vordefinierten Namen nicht für eigene Objekte verwendet werden.
MfG
HWK

Verfasst: Donnerstag 12. Juli 2007, 12:57
von uselessuser
Der Inhalt soll human-readable bleiben. Aber auch 'wb' hat nichts geaendert...

Verfasst: Donnerstag 12. Juli 2007, 14:40
von veers
uselessuser hat geschrieben:Der Inhalt soll human-readable bleiben. Aber auch 'wb' hat nichts geaendert...
Dann frage ich mich ob Pickle das richtige Werkzeug ist :wink:

Verfasst: Donnerstag 12. Juli 2007, 15:37
von uselessuser
Das mit Picke ist leider nicht meine Vorgabe ;) Aber mich interessiert ja vor allem, warum es _manchmal_ funktioniert. Selbe Parameter, selbe Daten, anderes Ergebnis...

Verfasst: Donnerstag 12. Juli 2007, 16:00
von veers
uselessuser hat geschrieben:Das mit Picke ist leider nicht meine Vorgabe ;) Aber mich interessiert ja vor allem, warum es _manchmal_ funktioniert. Selbe Parameter, selbe Daten, anderes Ergebnis...
Tönt irgend wie als wäre nicht Pickle daran schuld. Sicher das deine Disk noch in Ordnung ist? ;)

Verfasst: Donnerstag 12. Juli 2007, 16:23
von gerold
uselessuser hat geschrieben:Der Inhalt soll human-readable bleiben.
Hallo uselessuser!

Pickle speichert die Daten in eine Datei als Binärdump. Diese Datei lässt sich mit einem normalen Editor nicht korrekt auslesen. Das dürfte der Grund sein, weshalb ab und zu mal etwas angezeigt wird und dann wieder nicht. Das hängt auch vom Editor ab, mit dem du die Datei betrachtest.

Also ist Pickle nicht für dein Ziel, eine Human-readable-Datei zu erstellen, geeignet.

Schau dir pyYAML http://pyyaml.org/wiki/PyYAML an. Damit kannst du deine Daten menschenlesbar in eine Datei schreiben und auch wieder auslesen.

Ich erspare mir jetzt die Aufzählung aller Möglichkeiten, Daten menschenlesbar in eine Datei zu schreiben. Aber vielleicht solltest du dir diesen Thread noch einmal genau durchlesen: http://www.python-forum.de/topic-6157.html Vielleicht kannst du daraus etwas gewinnen.

mfg
Gerold
:-)

Verfasst: Donnerstag 12. Juli 2007, 17:01
von jens
gerold hat geschrieben:Pickle speichert die Daten in eine Datei als Binärdump.
IMHO kommt es auch darauf an, welches Protocol benutzt wird, siehe: http://docs.python.org/lib/node316.html
Per default wird Protocol version 0 verwendet und das ist ASCII.
Human-readable ist es deswegen aber nicht wirklich ;)

Verfasst: Donnerstag 12. Juli 2007, 17:27
von gerold
jens hat geschrieben:IMHO kommt es auch darauf an, welches Protocol benutzt wird
Hallo Jens!

Ja, das hatte ich vergessen. :oops:

Code: Alles auswählen

>>> import pickle
>>> l = [1, 2, 3, 4, 5]
>>> pickle.dumps(l)
'(lp0\nI1\naI2\naI3\naI4\naI5\na.'
>>> print pickle.dumps(l)
(lp0
I1
aI2
aI3
aI4
aI5
a.
>>> print pickle.dumps(l, pickle.HIGHEST_PROTOCOL)
€]q
>>> 
lg
Gerold
:-)