Probleme mit Modul cPickle

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Python Freunde

Wenn ich unter Windows (2000) mit einem Pythonprogramm
bei Verwendung des Moduls cPickle eine Liste in eine Datei
schreibe und nachher unter LINUX (SuSE 9) diese Datei mit
dem gleichen Pythonprogramm und Modul in eine Liste zurück-
lese tritt folgende Fehlermeldung auf:

Liste = CPickle.load(file)
ValueError: could not convert to float

Umgekehrt wenn mit dem Pytonprogramm eine liste unter LINUX
in eine Datei geschrieben wird, liest das gleiche Programm
unter Windows die Liste problemlos ein.

Die oben erwähnte Fehlermeldung unter LINUX kann ich beheben,
wenn ich die unter Windows erzeugte Datei vor ihrer Verwendung
unter LINUX zuerst mit KWrite öffne und unter dem gleichen
Dateinamen wieder abspeichere.

Ich vermute, dass unter Window zusätzlich ein unsichbares Zeichen
in die Datei geschrieben wird. Beim Ausdruck der Windows-Datei und
der mit KWrite konvertierten gleichen Windows-Datei kann ich keinen
Unterschied feststellen.

Hat jemand von euch diese Erfahrung auch schon gemacht? Gibt es eine
Programmiertechnische Lösung um diesen Effekt zu beseitigen?

Gruss wuf
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

das einzige, was verschieden sein dürfte, ist der Zeilenumsprung: Bei Win CRLN (\r\n) und unter lin nur LN (\n). Kannst ja auch mal probieren, nur Pickle statt cPickle zu importieren, da Pickle eh cPickle wenn möglich verwendet.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Milan

Danke für deinen Vorschlag!

Ich habe die Sache jetzt mit dem Modul pickle ausprobiert.
Das Verhalten ist bis auf Fehlermeldung das gleiche.

Die Fehlermeldung von Modul pickle heisst jetzt:

ValueError: insecure string pickle

Beheben kann ich das Problem wieder mit KWrtite.

Gruss wuf
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

sind denn die MD5 Checksummen vor und nach abspeichern gleich? Wenn ja (was ich mir nicht vorstellen kann) ist es ein Fehler (allein) von Python, ansonsten hast du recht mit deinem unsichtbaren Zeichen :wink: Ich wüsste aber nicht, was es außer nem Zeilenumsprung sein könnte (den Python wiederum automatisch erkennen sollte). Probier dann mal den Tipp von Voges...
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Milan hat geschrieben: Probier dann mal den Tipp von Voges...
Noch'n Tipp von mir: Vielleicht das komplette Gepickle im Binärmodus durchführen (falls das nicht schon geschieht). Das beträfe open(), pickle.dump() und dann auch ggf. den FTP-Transfer auf den Unix-Rechner.
Jan
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Milan & Voges

SUPER!! Eure Vorschläge das Problem mit Dateien
im Binärmodus anzupacken.

Die Wirkung war wie Hochleistungs-Schmieröl für
einen Rennmotor.

#~~ Lagert die Komponentendaten aus.
ComponentFile = open(path + project + file,"wb")
cPickle.dump(Components,ComponentFile,TRUE)
ComponentFile.close

#~~ Liest die Komponentendaten ein.
Liste = []
ComponentFile = open(path + project + file,"rb")
Liste = cPickle.load(ComponentFile)
Project.TempComponents = Liste
ComponentFile.close

Nur für Linux alleine würde scheinbar für das Erzeugen einer
binären Datei mit cPickle /pickle folgende SourceZeile
genügen:

cPickle.dump(Components,ComponentFile,TRUE)

Und für das Einlesen einer binären Datei ist das ("rb")
bzw. für das speichern ("wb") gar nicht notwendig, da die
open-Anweisung womöglich transparent ist! Die Strings
"wb" bzw. "rb" sind für Windows aber unerlässlich!

Wenn das Modul pickle bzw. cPickle Dateien unter den
verschiedenen Platformen wie Windos, Linux und Macintosh
im Textmodus erzeugt, kann ich mir jetzt gut vorstellen,dass
bei jeder Platform andere Steuerzeichfolgen für die Text-
formatierung verwendet werden.

OK nochmals vielen Dank für eure lehrreiche Hilfe!

Gruss wuf
:D
Take it easy Mates!
Antworten