ValueError: invalid literal for 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.
Antworten
Arnold
User
Beiträge: 5
Registriert: Donnerstag 25. Oktober 2007, 13:31

Donnerstag 25. Oktober 2007, 13:41

Hallo,

ich versuche fertige Methoden eines in Python und C programmieren Simulationsmodells einzubinden. Eine der Funktionen (mit dem im folgenden beschriebenen Fehler) liest zeilenweise Werte (Koordinaten x,y) aus einer Datei aus und speichert diese dann als Punkte (float) ab.

Methode:

Code: Alles auswählen

def readUngenerateFile(fd):
    """
    import a file, ofile, with the format
    [poly]
    poly format:
    First line:  <# of polynomial> <x centroid> <y centroid>
    Following lines: <x> <y> 
    last line:  "END"
    """
    END_DELIMITER = 'END'
    
    points = []
    segments = []
    
    isEnd = False
    line = fd.readline() #not used <# of polynomial> <x> <y>
    while not isEnd:
        line = fd.readline()
        fragments = line.split()
        vert = [float(fragments.pop(0)),float(fragments.pop(0))]
        points.append(vert)
        PreviousVertIndex = len(points)-1
        firstVertIndex = PreviousVertIndex
        
        line = fd.readline() #Read the next line
        while not line.startswith(END_DELIMITER): 
            #print "line >" + line + "<"
            fragments = line.split()
            vert = [float(fragments.pop(0)),float(fragments.pop(0))]
            points.append(vert)
            thisVertIndex = len(points)-1
            segment = [PreviousVertIndex,thisVertIndex]
            segments.append(segment)
            PreviousVertIndex = thisVertIndex
            line = fd.readline() #Read the next line
            i =+ 1
        # If the last and first segments are the same,
        # Remove the last segment and the last vertex
        # then add a segment from the second last vert to the 1st vert
        thisVertIndex = len(points)-1
        firstVert = points[firstVertIndex]
        thisVert = points[thisVertIndex]
        #print "firstVert",firstVert
        #print "thisVert",thisVert
        if (firstVert[0] == thisVert[0] and firstVert[1] == thisVert[1]):
            points.pop()
            segments.pop()
            thisVertIndex = len(points)-1
            segments.append([thisVertIndex, firstVertIndex])
        
        line = fd.readline() # read <# of polynomial> <x> <y> OR END
        #print "line >>" + line + "<<"
        if line.startswith(END_DELIMITER):
            isEnd = True
    
    #print "points", points       
    #print "segments", segments
    ungenerated_dict = {}
    ungenerated_dict['points'] = points
    ungenerated_dict['segments'] = segments
    return ungenerated_dict
Die Datei hat das folgende Format:
0
650627.026,9894796.636
650616.492,9894795.720
650608.560,9894795.031
...
...
END
Bei Zeile

Code: Alles auswählen

vert = [float(fragments.pop(0)),float(fragments.pop(0))]
im Code bekomme ich die Fehlermeldung:
ValueError: invalid literal for float(): 650627.026,9894796.636
Ich habe leider noch keine Ahnung von Python, leider aber auch nicht die Zeit, mich länger damit auseinander zu setzen. Sie jemand von euch, wo der Fehler liegt bzw. wie das Dateiformat aussehen müsste?

Beste Grüße,

Arne
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 25. Oktober 2007, 13:52

Python kennt kein Dezimal-Komma, nur einen Dezimalpunkt. Zeichen zur optischen Trennung von Tausenderstellen sind gar nicht vorgesehen. Wenn du die Daten nicht in einem anderen Format bekommen kannst, musst du die Zahlen zunaechst als String bearbeiten (Punkte rausnehmen, Kommas durch Punkte ersetzen) und danach erst in ein Float umwandeln.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Arnold
User
Beiträge: 5
Registriert: Donnerstag 25. Oktober 2007, 13:31

Donnerstag 25. Oktober 2007, 14:36

Das Format ist doch aber x,y, also "," als Trenzeichen, und die "." geben keine Tausenderstellen an, sondern das Dezimal-Komma.
TEXTiX-X
User
Beiträge: 20
Registriert: Montag 22. Oktober 2007, 08:40
Wohnort: Dortmund
Kontaktdaten:

Donnerstag 25. Oktober 2007, 14:40

probier mal nen leerzeichen nach dem komma
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Donnerstag 25. Oktober 2007, 14:48

Du versuchst, den String "650627.026,9894796.636" in eine(!) Fliesskommazahl umzuwandeln. Das geht aber nicht. Du muesstest erst den String aufsplitten und dann die einzelnen Teile in Fliesskommazahlen umwandeln.

Code: Alles auswählen

>>> s = "650627.026,9894796.636"
>>> zahlen = s.split(",")
>>> print zahlen
['650627.026', '9894796.636']
>>>> for zahl in zahlen:
...     print float(zahl)
Kurz und knapp:

Code: Alles auswählen

>>> zahlen = map(float, s.split(","))
>>> print zahlen
[650627.02599999995, 9894796.6359999999]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Arnold
User
Beiträge: 5
Registriert: Donnerstag 25. Oktober 2007, 13:31

Donnerstag 25. Oktober 2007, 15:21

Ok, danke euch. Jetzt funktioniert es und steht ja eigentlich auch im Code drin, wie das Format aussehen muss. Wusste nicht, das .split() ein Leerzeichen als Trennzeichen ist.
Antworten