cPickle tut nichts

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
uselessuser
User
Beiträge: 8
Registriert: Dienstag 29. Mai 2007, 20:54

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?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
uselessuser
User
Beiträge: 8
Registriert: Dienstag 29. Mai 2007, 20:54

Der Inhalt soll human-readable bleiben. Aber auch 'wb' hat nichts geaendert...
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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:
uselessuser
User
Beiträge: 8
Registriert: Dienstag 29. Mai 2007, 20:54

Das mit Picke ist leider nicht meine Vorgabe ;) Aber mich interessiert ja vor allem, warum es _manchmal_ funktioniert. Selbe Parameter, selbe Daten, anderes Ergebnis...
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

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? ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten