Python Konvertierung in Float

OP (Firma: (https://domes-finest.de)) #4724911
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?
Gast #4724974
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.
OP (Firma: (https://domes-finest.de)) #4724977
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.
Angehängte Dateien:
Gast #4724992
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!
OP (Firma: (https://domes-finest.de)) #4725055
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...
Gast #4725067
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.
Gast #4725070
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!
>>>
Gast #4725082
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.
Gast #4725087
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".
Gast #4725089
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'.
OP (Firma: (https://domes-finest.de)) #4725091
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
>>>
OP (Firma: (https://domes-finest.de)) #4725112
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
Gast #4725399
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren