Fehler abfangen "could not convert string to float"

  • Hallo zusammen,

    ich lese über ein kleines Python Skript Temperaturen (1wire) aus und schreibe diese in eine Datei:

    in der Datei steht dann zB. nur "7.234"

    in einem anderen Programm lese ich die Datei dann aus und rechne damit.

    Code
    schall = 331.5 + (0.6 * float(tempzis))


    ab und an läuft das Programm dann auf einen Fehler, ich vermute mal dass in der Datei keine Zahl steht sondern ein Wort/String. Ist aber nur eine Vermutung, da ich die Datei zu dem Zeitpunkt noch nicht lesen konnte und später dann wieder überschrieben wird. Auf jeden Fall wird das Programm dann mit der Meldung abgebrochen:

    Code
    Traceback (most recent call last):
      File "/mnt/ultraschall/NEU/ultra_messung_NEU_01.py", line 147, in <module>
        aktwert = distance_cm()
      File "/mnt/ultraschall/NEU/ultra_messung_NEU_01.py", line 126, in distance_cm
        schall = 331.5 + (0.6 * float(tempzis))
    ValueError: could not convert string to float:

    Wie kann ich in dem Skript das so abfangen, dass nur ein Zahlenwert in die Datei geschrieben wird und kein String??

    Danke schon mal

    F11

  • Fehler abfangen "could not convert string to float"? Schau mal ob du hier fündig wirst!

  • Zitat

    m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", Temp) # Wert aus zweiter Zeile prufen
    if m:
    value = str(float(m.group(2)) / 1000.0) # Wert nach t= auslesen und umwandeln


    Hier fehlt das else. D.h. wenn Du keinen Match hast wird der Wert aus value in die Datei geschrieben und der Fehlermeldung nach ist das ein Leerstring. Dieser kann natürlich nicht in eine float umgewandelt werden.
    Du musst also rausfinden warum Dein regex nicht matched. Oder immer value mit einem Wert initialisieren, der sonst nicht vorkommen kann. Z.B. -1. Letzteres ist aber ein Hack.

  • Hallo,

    Zitat

    ich vermute mal dass in der Datei keine Zahl steht sondern ein Wort/String. Ist aber nur eine Vermutung,


    Alles was du aus der Datei liest, ist Text - da gibt's keine Unterscheidung nach Datentypen.


    Zitat

    ab und an läuft das Programm dann auf einen Fehler,


    Heißt, es läuft mal, mal nicht? Dann liegt's ziemlich sicher dran, dass das Prog ab und an was aus der Datei ließt, was eben _keine_ String ist, der in einen Float umgewandelt werden kann. Das wäre z.B. ein String ein Zeichen außer 1-9 oder den Punkt . enthält.

    Ergänz das Skript mal zum Debuggen wie folgt:

    [code=php]try:
    schall = 331.5 + (0.6 * float(tempzis))
    except ValueError:
    print('Fehlerhafter Wert: {}'.format(tempzis))[/php]
    Dann siehst du, was schief läuft. Und dann musst du halt das Skript korrigieren, was den falschen Wert in die Datei schreibt.

    Gruß, noisefloor

  • Danke Euch für die Antworten und Vorschläge!! :bravo2:

    framp
    ich habe nun versucht den Fehler abzufangen und dann den alten Wert einzutragen. Hierzu habe ich die Funktion angelegt:

    Code
    def GetTemp10alterwert():
        file_temp_variable = open('/media/USB_DATA_01/anzeige/zisterne', 'r')
        value = str(file_temp_variable.read())
        file_temp_variable.close()
        return value

    und den Code um das else: erweitert

    Code
    if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", Temp): # Erste Zeile auf "YES" am Ende uberprufen
         Temp = a.readline()
         m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", Temp) # Wert aus zweiter Zeile prufen 
    else:
        GetTemp10alterwert()
    if m:
        value = str(float(m.group(2)) / 1000.0) # Wert nach t= auslesen und umwandeln
        a.close()

    stimmt das so? der Code läuft so durch. Ich weiß aber nicht, ob er auch das macht, was ich will :s


    @ noisefloor
    Ja, wenn kein Wert kommt, oder ein Leerzeichen, dann steigt er an der Stelle aus.
    Den Code habe ich mal so eingefügt, bisher ist der Fehler wieder auftaucht, dann muss ich nur Glück haben, dass die Meldung dann noch auf dem Bilddschirm ist. ;)
    Sicherheitshalber schreibe ich die Werte, in eine neue Zeile, noch in eine zweite Datei vielleicht sehe ich dann was.

    Einmal editiert, zuletzt von F11 (13. Dezember 2015 um 21:25)

  • ...stimmt das so? der Code läuft so durch. Ich weiß aber nicht, ob er auch das macht, was ich will :s ...

    Ich glaube nicht, denn das m wird im else Falle nicht gesetzt. Auch ist es unmöglich ohne Wissen was da eigentlich in der regex geparsed werden soll zu beurteilen.

    Ich würde an Deiner Stelle in beiden regex else Fällen die nicht matchende Zeile in einer Datei loggen und darüber prüfen, welcher Text nicht matched und entweder den regex anpassen oder wenn es ungültigen Daten sind einfach ignorieren oder einen definitiv nicht vorkommenden Messwert schreiben. Der Messwertleser muss dann bei dem Messwert einen Fehler anzeigen oder ihn ignorieren.

  • noisefloor
    Hallo noisefloor,

    Danke:bravo2: :bravo2: :bravo2:, der Vorschlag funktioniert!! :thumbs1:

    für die Nachwelt:
    hab in noch etwas angepasst

    Code
    with open(SensorPfad+Sensorname.strip()+'/w1_slave', 'r') as f: 
        for line in f.readlines():
            if not line.strip().endswith('YES'):
                Temp = line.strip().split('=')[1]
                value = str(float(Temp) / 1000.0)
            f.close()

    An der Stelle möchte ich mich bei allen großen Unterstützern, Moderatoren und Antwortern bedanken, für die Zeit, die Sie für viele kleine Anfänger opfern und tatkräftig mit Ihrem Wissen unterstützen. Somit hilft es einem Neuling sich in die Materie einzuarbeiten, ohne gleich die Lust zuverlieren und frustriert aufzugeben zu müssen. DANKE :danke_ATDE: :danke_ATDE: :danke_ATDE:

  • Hallo,

    schön. Leasson learned: viele Sachen gehen einfacher, als man zuerst denkt :)

    Anmerkung noch: das `f.close()`ist überflüssig (und wäre auch zu weit eingerückt). Das `with` Statement leitet automatisch einen Context Manager ein, der die Datei schließt, wenn der Code-Block innerhalb des `with`abgearbeitet / beendet ist. Darum kümmert sich Python sicher automatisch, von daher kein explizites `close()`.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!