Forum: PC-Programmierung Python Konvertierung in Float


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


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:
1
i_press_06 = row[6] //1024.0 als String

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

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

Vergleich mit Decimal
1
print(Decimal(i_press_06))
1
1024.0

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

Jemand eine Idee?

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Wie sieht denn der Inhalt von i_press_06 gnau aus?

2. Goggle-Treffer: 
http://stackoverflow.com/questions/379906/parse-string-to-float-or-int

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


Lesenswert?

Ah, sorry das hätte ich vielleicht noch erwähnen sollen

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

von Rolf M. (rmagnus)


Lesenswert?

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

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

von Dieter F. (Gast)


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

von Kaj (Gast)


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.
1
#!/usr/bin/env python3
2
3
if __name__ == '__main__':
4
    s = '1024.0'
5
    f = float(s)
6
    print('Type of f is [{0}] and the value is: [{1}]'.format(type(f), f))
1
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.

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


Angehängte Dateien:

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
von SR (Gast)


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)

von Kaj (Gast)


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!

von Dieter F. (Gast)


Lesenswert?

Er hat es wohl selbst bemerkt :-)

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


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:
1
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:20","DATA","","-0.07177726","0.023284907","0.8437448","-90"
2
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:20","DATA","","100","","","-90"
3
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:20","DATA","","23.986128","","","-82"
4
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:20","DATA","","62.240196","","","-82"
5
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:20","DATA","","1023.5561","","","-82"
6
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:22","DATA","","-0.07177726","0.02343748","0.8437448","-90"
7
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:22","DATA","","100","","","-90"
8
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:22","DATA","","23.98613","","","-81"
9
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:22","DATA","","62.240196","","","-81"
10
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:22","DATA","","1023.5561","","","-81"
11
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:23","DATA","","-0.07177726","0.018920878","0.8437448","-78"
12
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:23","DATA","","100","","","-78"
13
"E1:A9:50:DB:80:CD","","TEMP1","16-09-19 13:36:25","DATA","","23.98613","","","-90"
14
"E1:A9:50:DB:80:CD","","HUM","16-09-19 13:36:25","DATA","","62.240196","","","-90"
15
"E1:A9:50:DB:80:CD","","BAR","16-09-19 13:36:25","DATA","","1023.55615","","","-90"
16
"E1:A9:50:DB:80:CD","","ORIENT","16-09-19 13:36:27","DATA","","-0.07177726","0.018920878","0.8437448","-79"
17
"E1:A9:50:DB:80:CD","","BATT","16-09-19 13:36:27","DATA","","100","","","-79"

Hier der Python-Script
1
import codecs
2
import shutil
3
import io
4
import unicodecsv as csv
5
6
from decimal import Decimal
7
from influxdb import InfluxDBClient
8
#Test
9
i_test_01 = 0.0
10
i_test_02 = 0.0
11
12
13
#Bad
14
s_mac_01 = ''
15
i_temp_01 = 0.0
16
i_hum_01 = 0.0
17
i_press_01 = 0.0
18
i_batt_01 = 0.0
19
20
with open('test_data.csv', 'rb') as csvfile:
21
     spamreader = csv.reader(csvfile, delimiter=',', quotechar='"', encoding='utf-8')
22
     for row in spamreader:
23
         try:
24
             print('MAC:', row[0])
25
             #Bad
26
             if row[0] == 'E1:A9:50:DB:80:CD':
27
                  if row[2] == 'TEMP1':
28
                      s_mac_01 = row[0]
29
                      i_temp_01 = row[6]
30
                  if row[2] == 'HUM':
31
                      i_hum_01 = row[6]
32
                  if row[2] == 'BAR':
33
                      i_press_01 = row[6]
34
                  if row[2] == 'BATT':
35
                      i_batt_01 = row[6]
36
         except:
37
             print('Fehler')
38
39
40
print(float(i_temp_01))
41
print(float(i_hum_01))
42
print("Raw")
43
print(i_press_01)
44
print("ConvertToDecimal")
45
print(Decimal(i_press_01))
46
print("Repr")
47
print(repr(i_press_01))
48
print("Float")
49
print(float(i_press_01))
50
print("Fertig!")

Ausgabe weiterhin mit Fehler beim Float()
1
('MAC:', u'E1:A9:50:DB:80:CD')
2
('MAC:', u'E1:A9:50:DB:80:CD')
3
('MAC:', u'E1:A9:50:DB:80:CD')
4
('MAC:', u'E1:A9:50:DB:80:CD')
5
('MAC:', u'E1:A9:50:DB:80:CD')
6
('MAC:', u'E1:A9:50:DB:80:CD')
7
('MAC:', u'E1:A9:50:DB:80:CD')
8
('MAC:', u'E1:A9:50:DB:80:CD')
9
('MAC:', u'E1:A9:50:DB:80:CD')
10
('MAC:', u'E1:A9:50:DB:80:CD')
11
('MAC:', u'E1:A9:50:DB:80:CD')
12
('MAC:', u'E1:A9:50:DB:80:CD')
13
('MAC:', u'E1:A9:50:DB:80:CD')
14
('MAC:', u'E1:A9:50:DB:80:CD')
15
('MAC:', u'E1:A9:50:DB:80:CD')
16
('MAC:', u'E1:A9:50:DB:80:CD')
17
('MAC:', u'E1:A9:50:DB:80:CD')
18
29.4255299428
19
71.9706644786
20
Raw
21
1023.55615
22
ConvertToDecimal
23
1023.55615
24
Repr
25
u'1023.55615'
26
Float
27
949.913309142
28
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
von Dieter F. (Gast)


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.

von Sebastian (Gast)


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!
>>>

von SR (Gast)


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?

von Dieter F. (Gast)


Lesenswert?

Ich habe

from influxdb import InfluxDBClient

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

von lalala (Gast)


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.

von Dieter F. (Gast)


Angehängte Dateien:

Lesenswert?

Die habe ich erzeugt

von SR (Gast)


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".

von Kaj (Gast)


Lesenswert?

Ich habs mal von Hand gemacht:
1
#!/usr/bin/env python2
2
3
def main():
4
    #   open file
5
    csv_file = open('test_data.csv', 'r')
6
7
    #   read file content
8
    csv_content = csv_file.read().decode()
9
10
    #   close file
11
    csv_file.close()
12
13
    #   split content into lines
14
    rows = csv_content.splitlines()
15
16
    #   split lines into single elements
17
    for row in rows:
18
        elements = row.split(',')
19
        float_value = float(elements[6].replace('"', ''))
20
        print(float_value)
21
22
23
if __name__ == '__main__':
24
    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'.

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


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:
1
Python 2.7.9 (default, Mar  8 2015, 00:52:26)
2
[GCC 4.9.2] on linux2
3
Type "help", "copyright", "credits" or "license" for more information.
4
>>> testzahl = '1023.55615'
5
>>> f_testzahl = float(testzahl)
6
>>> print(f_testzahl)
7
949.913309257
8
>>>
9
>>> testzahl = '9999.9999'
10
>>> f_testzahl = float(testzahl)
11
>>> print(f_testzahl)
12
ERR
13
>>> testzahl = '99.99'
14
>>> f_testzahl = float(testzahl)
15
>>> print(f_testzahl)
16
112.255859375
17
>>>

von SR (Gast)


Lesenswert?

Dominik N. schrieb:
> [...]

WTF?

von Dieter F. (Gast)


Lesenswert?

Scharf :-/

Hast Du ein Hardware (Speicher) -Problem?

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

von Kaj (Gast)


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?

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


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!
1
apt-get update:
2
3
debconf: Perl may be unconfigured (Attempt to reload constant.pm aborted.
4
Compilation failed in require at /usr/share/perl/5.20/IPC/Open3.pm line 75.
5
BEGIN failed--compilation aborted at /usr/share/perl/5.20/IPC/Open3.pm line 75.
6
Compilation failed in require at /usr/share/perl/5.20/IPC/Open2.pm line 31.
7
Compilation failed in require at /usr/share/perl5/Debconf/ConfModule.pm line 7.
8
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/ConfModule.pm line 7.
9
Compilation failed in require at /usr/share/perl5/Debconf/AutoSelect.pm line 8.
10
BEGIN failed--compilation aborted at /usr/share/perl5/Debconf/AutoSelect.pm line 8.
11
Compilation failed in require at (eval 1) line 8.
12
BEGIN failed--compilation aborted at (eval 1) line 8.
13
) -- aborting

von Kaj (Gast)


Lesenswert?

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

von MaWin- (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.