pickle gibt convert error von string to float

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.
fretchen
User
Beiträge: 8
Registriert: Dienstag 19. Dezember 2006, 15:26

Montag 29. Januar 2007, 20:43

hallo, ich habe eine große liste.
diese lasse ich von einem programm mit picklen. dann rufe ich automatisch ein anderes programm auf welches dann diesen fehler ausgibt
raus.data
Traceback (most recent call last):
File "ber_script.py", line 6, in ?
angezeigt=pickle.load(f)
File "/usr/lib/python2.4/pickle.py", line 1390, in load
return Unpickler(file).load()
File "/usr/lib/python2.4/pickle.py", line 872, in load
dispatch[key](self)
File "/usr/lib/python2.4/pickle.py", line 968, in load_float
self.append(float(self.readline()[:-1]))
ValueError: invalid literal for float(): 0,01
ich habe in dem ursprungsprogramm dann natürlich geschaut ob es dort geht. hier entpickelt er aber ohne jeden anstand

nur kurz mal der code in dem programm welches den fehler verursacht

Code: Alles auswählen

import pickle as pickle
import pylab
name='raus.data'
f=file(name,'r')
print name
angezeigt=pickle.load(f)
f.close()
wenn jemand dieses problem kennt, wäre ich über hilfe echt begeistert, denn ich weiß nicht mehr was ich machen soll
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Montag 29. Januar 2007, 20:49

> sorry, nicht richtig gelesen, deshalb post wieder gelöscht.
Zuletzt geändert von Bernhard am Montag 29. Januar 2007, 20:54, insgesamt 1-mal geändert.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 29. Januar 2007, 20:50

Kann es sein, dass das Programm die pickle-Daten in Textdateien speichert (es kann nämlich sein, das da irgendetwas an der pickle-Datei korrumiert ist)? Zum Schreiben der pickle-Daten sollte stets der Dateimodus 'wb' genutzt werden, denn das ursprüngliche pickle-Protokoll (Protokoll 0) sieht zwar wie Text aus, ist es aber (so weit ich weiß) nicht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
fretchen
User
Beiträge: 8
Registriert: Dienstag 19. Dezember 2006, 15:26

Dienstag 30. Januar 2007, 06:54

also ich speichere die datei als *.data ab und auch mit dem wb-modus existiert weiterhin exakt der gleiche fehler.

hier ist nochmal der picklecode dazu

Code: Alles auswählen

gezeigtes=self.uebersicht.gezeigt[:]
print type(gezeigtes)
name='raus.data'
f=file(name, 'wb')
pickle.dump(gezeigtes, f)
f.close()
und wie gesagt gezeigt ist ne ne recht große liste. könnte es irgendwie an den typen in der liste hängen? eigentlich doch nicht oder?
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Dienstag 30. Januar 2007, 07:46

Du hast ein 0,01 "gepickelt", also ein String.
Den versucht Pickel, warum auch immer, als Float zu interpretieren,
das geht in die Hose.

Anderes Beipiel:

Code: Alles auswählen

f = float('3,1415926')
print f
führt zur selben Fehlermeldung:

Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: invalid literal for float(): 3,1415926

Ein Float hat in Python den Punkt als Dezimaltrenner, das Komma
dient für Aufzählungen (Listen, Tuple etc.)
fretchen
User
Beiträge: 8
Registriert: Dienstag 19. Dezember 2006, 15:26

Dienstag 30. Januar 2007, 07:58

puh, danke

das heißt ich habe voor 3monaten oder so nen fehler gemacht:(

das heißt viel viel arbeit :(
ich poste dann mal die lösung, wenn ich sie denn finde
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

Dienstag 30. Januar 2007, 08:16

was hast du gemacht?

pickle speichert strings auch nur als strings, gleiches mit floats. so ein fehler kann garnicht passieren, wenn du pickle richtig benutzt.

hast du die datei selber erstellt?

biete doch mal einen testcode an, der das problem reproduziert.
...meh...
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Dienstag 30. Januar 2007, 08:36

Hast Du vielleicht Deinen eigenen Pickler geschrieben ?
Man kann versucht sein, das zu tun, das Protokoll ist sehr einfach.
Ansonsten wüßte ich auch nicht, wie es dazu kommen soll.

Beispiel:

Code: Alles auswählen

import sys
import pickle

p = pickle.Pickler(sys.stdout)
p.dump(3.1415926)

# Geht, druckt sowas wie F3.1415926\n.

# Nun umgekehrt

f = open('float.dat','w')
print >>f,'F3,1415926\n.',
f.close()
u = pickle.Unpickler(open('float.dat'))
u.load()

# Geht nicht ...
>>> u.load()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "C:\Python23\lib\pickle.py", line 872, in load
dispatch[key](self)
File "C:\Python23\lib\pickle.py", line 968, in load_float
self.append(float(self.readline()[:-1]))
ValueError: invalid literal for float(): 3,1415926

Das Pickle Protokoll ist im Übrigen einfacher Text (genauer, Protokoll 0); ein 'wb' oder 'rb' beim
Öffnen der Datei sorgt nur dafür, das die Daten binär, also ohne Interpretation der platformspezifischen Eigenarten ('\n' vs. '\r\n') geschrieben oder gelesen werden. Das ist aber nur wichtig, wenn
das selbe Pickle-File z.B. von Windows nach Linux und vice-versa
gehen soll.

Siehe auch : http://docs.python.org/lib/node316.html bzw.
http://www.python.org/dev/peps/pep-0307/

Helfen wird Dir beim Bereinigen der Dateien der gute alte sed oder vi ;-)
fretchen
User
Beiträge: 8
Registriert: Dienstag 19. Dezember 2006, 15:26

Mittwoch 31. Januar 2007, 09:07

ich habe kein pickleprotokoll geschrieben aber ich habe eine vermutung, wenn ich das problem gefunden habe, dann schreibe ich es.

wenn es nicht so ist, dann werde ich mal fehlercode angeben
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 09:10

sunmountain hat geschrieben:

Code: Alles auswählen

f = open('float.dat','w')
print >>f,'F3,1415926\n.',
Was denn das für ein print? :shock:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Mittwoch 31. Januar 2007, 11:25

Das ``print`` wird in die Datei `f` umgeleitet. Eine der komischen Besonderheiten die Guido heute bereut, weil sie die Syntax unnötig kompliziert machen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 31. Januar 2007, 11:32

BlackJack hat geschrieben:Das ``print`` wird in die Datei `f` umgeleitet.
Kann übrigens auch jedes andere file-like-object sein, wie StringIO oder sys.stdout.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 12:20

Die Syntax hab ich bisher noch nie gesehen und werde die auch am besten gleich wieder vergessen ;)

Ist es wenigstens als deprecated bezeichnet?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Mittwoch 31. Januar 2007, 13:00

Es wird zusammen mit ``print`` als Anweisung in Python 3000 verschwinden.
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

Mittwoch 31. Januar 2007, 14:35

aehm, python verwendet . als kommazeichen, vllt liegts ja daran, hab das immer falsch und mit , gelesen in dem post
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Antworten