Hallo,
ich mochte Werte aus einer Text-Datei lesen und in float konvertieren
Die Text-Datei sieht so aus (als Beispiel)
'decimal';'23.345';'-123.3454'
Der Python Script (abgekürzt):
wert = float(spalte[1])
Error:
ValueError: invalid literal for float(): '23.345'
Any Ideas?
pe
error bei string to float
Die Anführungszeichen sind das Problem, die sind nicht Bestandteil von Zahlen. Das hier müsste funktionieren:
Wie kommen die Daten denn in Dein Programm? Wenn Du die Datei mit dem `csv` Modul einliest, dann kannst Du festlegen welche Art von Anführungszeichen in den Einträgen vorkommen können. Die werden dann automatisch rausgefiltert.
Code: Alles auswählen
wert = float(spalte[1][1:-1])
Hallo, danke für den Vorschlag!BlackJack hat geschrieben:Die Anführungszeichen sind das Problem, die sind nicht Bestandteil von Zahlen. Das hier müsste funktionieren:
Wie kommen die Daten denn in Dein Programm? Wenn Du die Datei mit dem `csv` Modul einliest, dann kannst Du festlegen welche Art von Anführungszeichen in den Einträgen vorkommen können. Die werden dann automatisch rausgefiltert.Code: Alles auswählen
wert = float(spalte[1][1:-1])
Ja, die Daten kommen aus einer cvs-Datei. Darin sind coordenaten in unterschiedlichen Formate. Ich kann deswegen die ' nicht einfach rausfiltern, da einige Einträge so aussehen : 45°56'12''N
Mein Script erkennt die unterschiedlichen Formate (lat-long, GPS, decimal-degrees) uns soll sie alle in decimal-degrees umwandeln. Bei lat-long und GPS-Format klappt es ohne Probleme, Aber bei dec.degrees bekomme ich den Error.
Bei deinen Vorschlag kriege ich den error:
ValueError: invalid literal for float(): -123.3454'
Ich habe es geändert in
wert = float(spalte[1][1])
Kriege ich aber den selben Error!
Verstehe ich nicht, den im der console klapt es:
>>> a = "1234"
>>> b = a[1]
>>> b
'23'
>>>
pe
Warum kann ich in der console:Verstehe ich nicht, den im der console klapt es:
Code: Alles auswählen
>>> a = "123.3"
>>> b=float(a)
>>> b
123.3
>>>
pe
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hallo pmartinez, willkommen im Forum,
Du siehst also, du liest aus der Datei zu viele Anführungszeichen heraus, mit denen float() nichts anfangen kann.
Ganz einfach, weil dein String den du aus einer Datei ausliest anders aussieht als der den du in die Konsole eintippst:pmartinez hat geschrieben:Warum kann ich in der console:Aber nicht wenn ich aus einer datei lese?Code: Alles auswählen
>>> a = "123.3" >>> b=float(a) >>> b 123.3 >>>
Code: Alles auswählen
In [1]: con_str = "123.3"
In [2]: float(con_str)
Out[2]: 123.3
In [3]: dat_str = "'123.3'"
In [4]: float(dat_str)
---------------------------------------------------------------------------
exceptions.ValueError Traceback (most recent call last)
/home/marek/<ipython console>
ValueError: invalid literal for float(): '123.3'
In [5]: print con_str
123.3
In [6]: print dat_str
'123.3'
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ich schon wieder:
Ich habs.
Das Problem ist wenn der String am Ende der Zeile ist, muss man
2 Zeichen (nicht nur 1 ) vom abziehen. Ist das vielleicht der unsichtbaren Retourn Zeichen?
Also es klapt wenn es heisst:
Im Gegensatz:
Danke für den Tip!
pe
Ich habs.
Das Problem ist wenn der String am Ende der Zeile ist, muss man
2 Zeichen (nicht nur 1 ) vom abziehen. Ist das vielleicht der unsichtbaren Retourn Zeichen?
Also es klapt wenn es heisst:
Code: Alles auswählen
>>> for zeile in zeilen:
... spalte = re.split('[;]',zeile)
... print "%s %s %s" % (spalte[0][1:-1], spalte[1][1:-1], spalte[2][1:-2])
...
primera 45°23'12N 123°56'23E
segunda 23°34'56S 12°45'56W
decimal 23.345 -123.3454
Code: Alles auswählen
>>> for zeile in zeilen:
... spalte = re.split('[;]',zeile)
... print "%s %s %s" % (spalte[0][1:-1], spalte[1][1:-1], spalte[2][1:-1])
...
primera 45°23'12N 123°56'23E'
segunda 23°34'56S 12°45'56W'
decimal 23.345 -123.3454'
pe
Das `csv`-Modul filtert auch nicht alle heraus sondern nur die, die zum einschliessen von Werten benutzt werden. Der Wert, den Du da oben angibst, wie sieht der denn in der Datei genau aus? Wenn da wirklich ein ' einfach so mitten im Wert steht, dann bekommt das `csv` Modul allerdings ein Problem.pmartinez hat geschrieben:Ja, die Daten kommen aus einer cvs-Datei. Darin sind coordenaten in unterschiedlichen Formate. Ich kann deswegen die ' nicht einfach rausfiltern, da einige Einträge so aussehen : 45°56'12''N
Wie kommen die Werte denn zustande? Warum ist da um jeden Wert überhaupt ein einfaches Anführungszeichen?
Das Problem hast Du mit dem `csv` Modul auch nicht, das entfernt das Zeilenende für Dich.Bei deinen Vorschlag kriege ich den error:
ValueError: invalid literal for float(): -123.3454'
Code: Alles auswählen
In [10]: a = StringIO("'decimal';'23.345';'-123.3454'\n")
In [11]: b = csv.reader(a, delimiter=';', quotechar="'")
In [12]: for row in b:
....: print row
....:
['decimal', '23.345', '-123.3454']
Jetzt weiss ich was du meinst. Ich habe das csv-Modul gar nicht benutzt (wusste nicht von seiner Existenz) sonder zu Fuss mit:Das `csv`-Modul filtert auch nicht alle heraus sondern nur die, die zum einschliessen von Werten benutzt werden. Der Wert, den Du da oben angibst, wie sieht der denn in der Datei genau aus? Wenn da wirklich ein ' einfach so mitten im Wert steht, dann bekommt das `csv` Modul allerdings ein Problem.
Code: Alles auswählen
zeile = datei.readline()
zeilen = datei.readlines()
for zeile in zeilen:
spalte = re.split('[;]',zeile)
Sind in einer Excel-Datei, per OpenOffice als CSV gespeichert und las quotechar ' gewählt.Wie kommen die Werte denn zustande? Warum ist da um jeden Wert überhaupt ein einfaches Anführungszeichen?
Mit dem csv-Modul geht es super. Habe schon ausprobiert. Danke.