csv.writer.writerow() schreibt zu viele Nachkommastellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo,

ich habe das ungewöhnliche Problem, dass mir die Funktion csv.writer.writerow() in der zu schreibenden txt-datei statt zwei Nachkommastellen (wie das array, das der funktion übergeben wird) 15 Nachkommastellen reinpackt.
So wird aus 25.44 ein 25.440000000000001
Dies bläht meine txt-Datei auf über 5mb auf, statt sonst nur etwa 2 mb (es sind über 2000000 Zeilen).

Ich habe keine Ahnung woher der Fehler kommt. Wenn ich mir in der Python-Console das Array ausspucken lasse, welches ich der Funktion übergebe, sind es immer nur 2Nachkommastellen. Der Fehler scheint also eindeutig nur in dieser Funktion zu stecken.

Das Problem ist für mich gar nicht so unerheblich, da ich über 1500-csv-Dateien habe, die ich mittels dem Pythonskript in txt-Dateien wandeln muss (und deren aufbau geänder werden muss). Da macht ein Unterschied von 3mb pro datei schon etwas aus.

Wie kann ich diesen Fehler beheben?

Danke
Gruß
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pittan: welche Python-Version verwendest Du?
BlackJack

@Pittan: Du müsstest die Zahlen explizit in Zeichenketten umwandeln und dabei per Formatierungscode die Anzahl der Nachkommastellen auf zwei begrenzen. Das Problem hier ist, dass der Rechner 25.44 intern nicht nicht exakt speichern kann:

Code: Alles auswählen

In [4]: '%.50f' % 25.44
Out[4]: '25.44000000000000127897692436818033456802368164062500
Gleitkommazahlen halt.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hi,
Ich verwende Python 2.7
Das wandeln in string habe ich schon versucht ( .astype(str) ) - die führte aber dazu, dass alles nach dem Punkt wegfiel - aus 25.44 wurde 25. Ich bin mir aber sicher dass man an der stelle noch was machen kann - nur wie?

Danke schon mal
Gruß
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pittan: so jetzt kommen wir der Sache schon etwas näher. Du benutzt also numpy. Python sucht sich nämlich seit 2.7 die kürzeste Zahlendarstellung, die die Zahl noch exakt darstellt, wenn aber externe Bibliotheken da reinspielen, ist das natürlich nicht mehr gegeben. Du kannst also entweder Deine Arrays in Listen umwandeln (tolist) oder gleich numpy.savetxt benutzen, da kann man nämlich das Zahlenformat direkt angeben.
Pittan
User
Beiträge: 34
Registriert: Freitag 1. August 2014, 15:56

Hallo,
ja, ich benutze numpy.
Die Lösung war nun ganz einfach: die importierten Daten habe ich expilizit als string importiert - dann passt alles.
Dies hat auch den Vorteil, dass die Daten "sicherer" sind - es können keine rechnerischen Manipulationen vorgenommen werden.

Schönen Gruß
Antworten