mikrocontroller.net

Forum: PC-Programmierung Python Konvertierung in Float


Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich hänge im Moment etwas an der Konvertierung mit Python. Leider blieb 
ich nach Suchen in Google etc. erfolglos. Vielleicht kann mir ja jemand 
den richtigen Anstoß geben...

Mein Problem:
Ich lese eine CSV-Datei aus, in dieser stehen Werte die ich in Float 
wandeln möchste. Allerdings passiert beim Wandel höchst seltsames, er 
generiert eine völlig sinnfreie Kommazahl.

Vorgehensweise(Zuweisung aus der CSV:
i_press_06 = row[6] //1024.0 als String

dann wird gewandelt:
print(float(i_press_06))
Liefert:
2682.61718703

Versuch mit replace:
print(float(i_press_06.replace('', '')))
2682.61718703

Vergleich mit Decimal
print(Decimal(i_press_06))
1024.0

Nochmal Ausgabe mit repr
print(repr(i_press_06))
'1024.0'

Jemand eine Idee?

: Bearbeitet durch User
Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn der Inhalt von i_press_06 gnau aus?

2. Goggle-Treffer: 
http://stackoverflow.com/questions/379906/parse-st...

Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, sorry das hätte ich vielleicht noch erwähnen sollen

mit in row[6] stehen 1024.0 als String
i_press_06 = row[6] //1024.0 als String

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik N. schrieb:
> mit in row[6] stehen 1024.0 als String

Bist du da sicher?
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> i_press_06 = '1024.0'
>>> print(float(i_press_06))
1024.0
>>> 

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, Du liest falsch ein (oder hast noch ein Sonderzeichen, z.B. 
TAB, mit drin):

row = [0, 1 , 2, 3, 4, 5, "1024.0", 7]
print(float(row[6]))

->

1024.0

Process finished with exit code 0

: Bearbeitet durch User
Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Python Version?
Welches Betriebssystem?
Zeig bitte mal ganzen Code wenn möglich, und am besten noch eine kleine 
Beispiel CSV, denn dass was du da beschreibst ist so nicht 
nachvollziehbar.
#!/usr/bin/env python3

if __name__ == '__main__':
    s = '1024.0'
    f = float(s)
    print('Type of f is [{0}] and the value is: [{1}]'.format(type(f), f))
Type of f is [<class 'float'>] and the value is: [1024.0]
Das funktioniert ganz wunderbar.

Soll heißen: In row[6] steht nicht das drin, was du denkst.
Dafür kann es mehrere Gründe geben, z.B. ein falsches Encoding beim 
öffnen der Datei (bin ich bei Win10 drüber gestolpert).

Ohne Code (wie öffnest du die Datei? Wie liest du die Datei ein? usw.) 
und ohne Beispiel Daten kann man dir aber nur schwer helfen.

Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hey es mal in der Konsole ausgeführt. Hier ein Screenshot vom Code sowie 
der Ausgabe...
Es ist ganz klar der richtige Wert als String vorhanden. Auch das 
wandeln in Decimal klappt. Nur sobald es in Float passieren soll 
passiert mist.
Ich dachte erst evtl. liegt es am Komma? Scheint aber völlig andere 
Ursache zu haben.

: Bearbeitet durch User
Autor: SR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute auch, dass in row[6] Blödsinn steht.

--> brauchen also den Quelltext und die .csv (reicht ja die Zeile mit 
dem Fehler)

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik N. schrieb:
> Es ist ganz klar der richtige Wert als String vorhanden. Auch das
> wandeln in Decimal klappt. Nur sobald es in Float passieren soll
> passiert mist.
Das ausschließen einer Fehlerquelle ist meistens der größte Fehler.

Oder anders gesagt:
Jede Katastrophe beginnt mit einer falschen Annahme!

Zeig den gesamten Code (bitte als Datei anhängen oder in Code-Tags!) und 
einen Ausschnitt der CSV!

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er hat es wohl selbst bemerkt :-)

Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo Zusammen,
1.) danke für Euer bemühen Dieter und Kaj!
2.) Nein ich habe es noch nicht herausgefunden, in meiner richtigen 
Version lebe ich jetzt mit Decimal. Dafür haben ich jetzt die Datenbank 
angepasst.

Da der Script etwas groß war habe ich nun eine Forum-Taugliche Version, 
die den gleichen Fehler ausgibt... Ich fühle mich grade wie: "Mein 
erster Tag Python". Ausgeführt wird das alles auf einem Debian System 
mit Python2.7

Zum Projekt:
Ein Linux mit Bluetooth sammelt von Sog. Tokencubs (Bluetooth LE 
Sensoren mit Temp. / Feuchtigkeit. / Drucksensoren die Daten ein und 
übermittelt sie in eine InfluxDB.


Hier die CSV:
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:20","DATA","","-0.07177726","0.023284907","0.8437448","-90"
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:20","DATA","","100","","","-90"
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:20","DATA","","23.986128","","","-82"
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:20","DATA","","62.240196","","","-82"
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:20","DATA","","1023.5561","","","-82"
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:22","DATA","","-0.07177726","0.02343748","0.8437448","-90"
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:22","DATA","","100","","","-90"
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:22","DATA","","23.98613","","","-81"
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:22","DATA","","62.240196","","","-81"
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:22","DATA","","1023.5561","","","-81"
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:23","DATA","","-0.07177726","0.018920878","0.8437448","-78"
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:23","DATA","","100","","","-78"
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:25","DATA","","23.98613","","","-90"
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:25","DATA","","62.240196","","","-90"
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:25","DATA","","1023.55615","","","-90"
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:27","DATA","","-0.07177726","0.018920878","0.8437448","-79"
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:27","DATA","","100","","","-79"

Hier der Python-Script
import codecs
import shutil
import io
import unicodecsv as csv

from decimal import Decimal
from influxdb import InfluxDBClient
#Test
i_test_01 = 0.0
i_test_02 = 0.0


#Bad
s_mac_01 = ''
i_temp_01 = 0.0
i_hum_01 = 0.0
i_press_01 = 0.0
i_batt_01 = 0.0

with open('test_data.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=',', quotechar='"', encoding='utf-8')
     for row in spamreader:
         try:
             print('MAC:', row[0])
             #Bad
             if row[0] == 'E1:A9:50:DB:80:CD':
                  if row[2] == 'TEMP1':
                      s_mac_01 = row[0]
                      i_temp_01 = row[6]
                  if row[2] == 'HUM':
                      i_hum_01 = row[6]
                  if row[2] == 'BAR':
                      i_press_01 = row[6]
                  if row[2] == 'BATT':
                      i_batt_01 = row[6]
         except:
             print('Fehler')


print(float(i_temp_01))
print(float(i_hum_01))
print("Raw")
print(i_press_01)
print("ConvertToDecimal")
print(Decimal(i_press_01))
print("Repr")
print(repr(i_press_01))
print("Float")
print(float(i_press_01))
print("Fertig!")

Ausgabe weiterhin mit Fehler beim Float()
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
29.4255299428
71.9706644786
Raw
1023.55615
ConvertToDecimal
1023.55615
Repr
u'1023.55615'
Float
949.913309142
Fertig!

Wie man in der CSV-Datei sieht ist der Wert der als "Raw" oder Decimal 
angezeigt wird auch der letzte Druck-Wert der in der CSV zu finden ist. 
Das was bei Float ausgegeben wird ist nicht in der CSV zu finden. Ich 
kann mir also nur vorstellen das hier ein Fehler in der Codierung 
vorliegt.... Finden tue ich den Fehler leider nicht.

Hat noch jemand eine Idee? Ich hab jetzt zwar nen Workaround, in Python 
allerdings keine Gleitkommazahl wandeln zu können verwundert mich doch 
schwer...

: Bearbeitet durch User
Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MAC: E1:A9:50:DB:80:CD
23.98613
62.240196
Raw
1023.55615
ConvertToDecimal
1023.55615
Repr
'1023.55615'
Float
1023.55615
Fertig!

Allerdings mit Python 3.3 ausgeführt. Ggf. liegt da das Problem.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

mit Python 2.7 geht's auch:

Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 
64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
=================== RESTART: C:\TEMP\pythontest\script.py 
===================
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
('MAC:', u'E1:A9:50:DB:80:CD')
23.98613
62.240196
Raw
1023.55615
ConvertToDecimal
1023.55615
Repr
u'1023.55615'
Float
1023.55615
Fertig!
>>>

Autor: SR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal deine .csv, wie hier gepostet, auch so in eine Textdatei 
gepackt? (Mit einem vernünftigen Editor deiner Wahl)?


--> evtl. steht da was ganz anderes drin als hier gepostet?

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe

from influxdb import InfluxDBClient

entfernt, da nicht vorhanden (und benötigt).

Autor: lalala (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
häng mal die CSV als Datei an. (oder nimm mal die CSV die Du gepostet 
hast, mach Copy und Past in eine neue Datei und schau ob das 
funktioniert). Vielleicht ist der problematische Inhalt beim ins Forum 
konvertieren verloren gegangen.

Autor: Dieter F. (jim_quakenbush)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Die habe ich erzeugt

Autor: SR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm vielleicht auch mal Testweise das Encoding utf8 raus (oder gibt es 
wirklich utf-8) Daten?

Auch das with open('test_data.csv', 'rb') würde ich mal testweise auf 
'r' ändern; sehe hier eher Probleme als Chancen für "read binary".

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs mal von Hand gemacht:
#!/usr/bin/env python2

def main():
    #   open file
    csv_file = open('test_data.csv', 'r')

    #   read file content
    csv_content = csv_file.read().decode()

    #   close file
    csv_file.close()

    #   split content into lines
    rows = csv_content.splitlines()

    #   split lines into single elements
    for row in rows:
        elements = row.split(',')
        float_value = float(elements[6].replace('"', ''))
        print(float_value)


if __name__ == '__main__':
    main()
Ist mit Sicherheit nicht der beste Code, funktioniert aber super.

Frage:
Dominik N. schrieb:
> with open('test_data.csv', 'rb') as csvfile:
Warum öffnest du die Datei im binär-modus?
Ich denke das könnte eine Fehlerursache sein.

Versuch mal nur 'r' stat 'rb'.

Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, vielen Dank für eure Unterstützung!

Dem Problem bin ich leider bis dato nicht weiter. Scheint aber so als 
hängt es tatsächlich am Python oder an meinem Linux System.. (Siehe 
Beispiel)
Macht jetzt wahrscheinlich für mich den Aufwand nicht gerechtfertigt. 
Ich werde das System am Ende dieser Woche mal neu aufsetzten und dann 
nochmal einen Test fahren, mit meinem Workaround komme ich jetzt ja mal 
weiter.

Aber trotzdem, eine Idee warum sowas passiert?
Linux zerschossen?
Irgendwelche Indikatoren für solche Probleme?

Beispiel:
Python 2.7.9 (default, Mar  8 2015, 00:52:26)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> testzahl = '1023.55615'
>>> f_testzahl = float(testzahl)
>>> print(f_testzahl)
949.913309257
>>>
>>> testzahl = '9999.9999'
>>> f_testzahl = float(testzahl)
>>> print(f_testzahl)
ERR
>>> testzahl = '99.99'
>>> f_testzahl = float(testzahl)
>>> print(f_testzahl)
112.255859375
>>>

Autor: SR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik N. schrieb:
> [...]

WTF?

Autor: Dieter F. (jim_quakenbush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scharf :-/

Hast Du ein Hardware (Speicher) -Problem?

Oh, kann eigentlich nicht sein, wenn es mit Deinem Workaround 
funktioniert ...

: Bearbeitet durch User
Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab mir mal die Python-Version 2.7.9 installiert, funktioniert trotzdem 
einwandfrei. :o

Was hast du da überhaupt für eine Maschine? X86? ARM? Irgendein embedded 
Board wie ein RPi oder sowas?

Autor: Dominik N. (Firma: (https://domes-finest.de)) (dominik280)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, Kaj und Dieter

alles sehr mysteriös. Das ganze spielt sich auf einem RPi mit Debian 
(Raspbian) ab und aufgesetzt ist das schon seit knapp einem halben Jahr. 
Bei den anderen Diensten die drauf laufen habe ich seitdem auch keinen 
Fehler feststellen können.

Hab eben mal nen apt-get upgrade ausführen wollen, der mit Fehler 
beendet wurde.

Ist vielleicht wirklich ein schlag auf der SD-Karte o.ä.! Wenn es so ist 
dann wäre es wirklich krass, dass es sich erst bei einem Umwandlung in 
Gleitpunktzahl herausstellt!

Ich setzt das Ding am Ende der Woche mal neu auf und installiere alles 
wieder in den gleichen Rahmenbedingungen. Ich halte euch dann mal auf 
dem laufenden!

Vielen Dank, aus der Pfalz, für eure tolle Unterstützung!
apt-get update:

debconf: Perl may be unconfigured (Attempt to reload constant.pm aborted.
Compilation failed in require at /usr/share/perl/5.20/IPC/Open3.pm line 75.
BEGIN failed--compilation aborted at /usr/share/perl/5.20/IPC/Open3.pm line 75.
Compilation failed in require at /usr/share/perl/5.20/IPC/Open2.pm line 31.
Compilation failed in require at /usr/share/perl5/Debconf/ConfModule.pm line 7.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/ConfModule.pm line 7.
Compilation failed in require at /usr/share/perl5/Debconf/AutoSelect.pm line 8.
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/AutoSelect.pm line 8.
Compilation failed in require at (eval 1) line 8.
BEGIN failed--compilation aborted at (eval 1) line 8.
) -- aborting

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab leider keinen RPi hier, sonst würd ich das gleich mal testen :-/

Autor: MaWin- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tritt bei mir auf dem Raspi3 nicht auf.
pi@raspberry:~$ python2
Python 2.7.9 (default, Mar  8 2015, 00:52:26) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> testzahl = '1023.55615'
>>> f_testzahl = float(testzahl)
>>> print(f_testzahl)
1023.55615

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.