Wie in Datei einen Zahlenwert erh�hen ? - Newbie fragt
Hier ist Ausschnitt aus GPX-Datei: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <gpx version="1.0" creator="CanWay - http://www.canwaygps.com" <time>2016-09-28T22:19:56Z</time> <bounds minlat="47.666017" minlon="11.851379" maxlat="47.672462" maxlon="11.886779" /> <trk> <name>2016-09-15_obere-firstalm_gehen-6,5km</name> <trkseg> <trkpt lat="47.671193" lon="11.886518"> <ele>1115.6</ele> <time>2016-09-15T11:57:44Z</time> <speed>0.2</speed> </trkpt> <trkpt lat="47.670686" lon="11.886412"> <ele>1117.6</ele> <time>2016-09-15T11:58:14Z</time> <speed>0.3</speed> </trkpt> <trkpt lat="47.670821" lon="11.886459"> <ele>1055.6</ele> <time>2016-09-15T11:58:44Z</time> <speed>0.4</speed> </trkpt> Problem: Ich will die Höhenwerte (float zwischen <ele> und </ele> um 30 erhöhen. Beispiel alt: <ele>1115.6</ele> Beispiel neu: <ele>1145.6</ele> Folgender Code funktioniert nicht: import re f1 = raw_input("GPX-Datei eingeben: ") f1 = open(f1) for line in f1: res = re.search(r"<(ele)>(.+)</\1>",line) if res: #print res.group(2) number=float(res.group(2)) number_elev=number+20 number_elev=str(number_elev) res = re.sub(res.group(2),number_elev,str) f1.close() print "OK" Wo liegt der Fehler? Bitte um / thx vorab für Hinweise. Josef
Hallo Josef, zunächst mal: "Folgender Code funktioniert nicht:" ist keine ausreichende Fehlerbeschreibung! Schreibe bitte, wie du den Code ausführst, was passiert / was er ausgibt und was du erwartet hättest. Zweitens ist der GPX-Schnipsel, den du gepostest hast unvollständig und inkorrekt (z.B. nicht geschlossener Start-Tag). Wie sollen wir deinen Code damit ausprobieren? Wie sollen wir wissen, mit welchem Input du deinen Code tatsächlich ausgeführt hast? Aber davon abgesehen: Am 22.01.19 um 14:33 schrieb Josef:
Hier ist Ausschnitt aus GPX-Datei: [...] Folgender Code funktioniert nicht: import re
XML-basierte Dateiformate mit Regular Expressions zu parsen ist selten eine gute Idee. Man muss da sehr vorsichtig sein, dass die Regex nicht zu viel matcht, da die Schachtelungstiefe von Elementen beliebig groß sein kann und einzelne Tags Attribute in beliebiger Reihenfolge und mit beliebig viel Whitespace zwischendrin enthalten können, usw. Deswegen nimm lieber eine fertige Bibliothek zum Parsen von GPX-Dateien, die auf einem XML-Parser basiert: https://pypi.org/project/gpxpy/ Wie man die für deinen Zweck benutzt können wir dir zeigen, wenn du uns eine richtige GPX-Datei als Input zur Verfügung stellst (wenn sie nicht zu groß ist, als Anhang, ansonsten z.B. in einem Pastebin oder Github Gist). Gruß, Chris
Am 22.01.19 um 15:06 schrieb Christopher Arndt:
Deswegen nimm lieber eine fertige Bibliothek zum Parsen von GPX-Dateien, die auf einem XML-Parser basiert:
Übrigens, wenn es dir darum geht, die Elevation-Werte den tatsächlichen geographischen Gegebenheiten anzupassen, empfehle ich die Benutzung der "Shuttle Radar Topography Mission" Daten, für die es auch ein Python-Modul gibt [1]: #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import srtm import gpxpy if len(sys.argv) < 3: sys.exit("Usage: fix-elevation <input.gpx> <output.gpx>") with open(sys.argv[1]) as fp: gpx = gpxpy.parse(fp) elevation_data = srtm.get_data() elevation_data.add_elevations(gpx, smooth=True) with open(sys.argv[2], 'w') as fp: fp.write(gpx.to_xml()) [1] https://github.com/tkrajina/srtm.py
On 22/01/2019 14:33, Josef wrote:
Hier ist Ausschnitt aus GPX-Datei: <?xml version="1.0" encoding="utf-8" standalone="yes"?> [...]
Problem: Ich will die Höhenwerte (float zwischen <ele> und </ele> um 30 erhöhen. Beispiel alt: <ele>1115.6</ele> Beispiel neu: <ele>1145.6</ele>
Folgender Code funktioniert nicht:
Wenn du schreibst, dass etwas "nicht funktioniert", ist es für die Empfänger der Frage fast immer sehr nützlich zu wissen, _auf welche Weise_ etwas nicht funktioniert. :-) Zum Beispiel: Bekommst du falsche Ergebnisse (auf welche Art falsch?) oder eine Exception (ggf. welche)?
import re f1 = raw_input("GPX-Datei eingeben: ") f1 = open(f1) for line in f1: res = re.search(r"<(ele)>(.+)</\1>",line) if res: #print res.group(2) number=float(res.group(2)) number_elev=number+20 number_elev=str(number_elev) res = re.sub(res.group(2),number_elev,str) f1.close() print "OK"
Wo liegt der Fehler?
Falls dein Problem darin besteht, dass die Datei nicht geändert wird, könnte es schon daran liegen, dass du die Datei nur liest, aber die geänderten Zeichenketten nicht in eine neue Datei schreibst. Vielleicht ist der obige Code aber nur ein Auszug aus deinem "eigentlichen" Code? Noch ein Tipp: Wenn du keine besonderen Gründe hast, Python 2 zu benutzen, nimm lieber Python 3. Der Support für Python 2 läuft Anfang des nächsten Jahres aus und Python 3 hat auch eine Menge Verbesserungen. Viele Grüße Stefan
participants (3)
-
Christopher Arndt -
Josef -
Stefan Schwarzer