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:
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
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.
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.
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!
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:
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...
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.
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?
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.
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".
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'.
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:
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?
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!