Text aus Datei einlesen und umformatiert in Datei ausgeben

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
archifox
User
Beiträge: 9
Registriert: Sonntag 9. November 2014, 19:55

Hallo,

ich bin absoluter Programierneuling und arbeite mich derzeit fleissig durch dieses Tutorial: http://www.python-kurs.eu/kurs.php

Bei den regulären Ausdrücken stoße ich aber derzeit noch an meine Grenzen! Es wäre nett, wenn Ihr mir bei meinem aktuellen Problem ein wenig helfen könntet:

Gegeben sei eine Text-Datei mit z.B. dem folgenden Inhalt (wie man diese öffnet und die Ausgabe in eine Datei schreibt weiß ich schon, aber das Zerlegen der Strings will einfach nicht hinhauen):

_WP1.OriginalPoint = ZonePoint(50.7529923920221, 6.51497832083385, 0)
_RP3.OriginalPoint = ZonePoint(50.7678521421, 6.514977803711, 0)
Start.OriginalPoint = ZonePoint(50.7534521, 6.514976523, 0)
Referenzpunkt.OriginalPoint = ZonePoint(50.7534521333, 6.5149747321, 0)

Die gewünschte Ausgabe soll so aussehen:

_WP1: N 50.7529923920221 E 6.51497832083385
_RP3: N 50.7678521421 E 6.514977803711
Start: N 50.7534521 E 6.514976523
Referenzpunkt: N 50.7534521333 E 6.5149747321

Es soll also der String vor dem ersten Punkt ausgegeben werden, dann ein ": N " dann die erste Zahl vor dem Komma, dann " E " und dann die 2. Zahl vor dem 2. Komma.

Vorab schon einmal vielen Dank für Eure Unterstützung!

archifox
BlackJack

@archifox: Ich würde empfehlen auch noch ein anderes Tutorial zu verwenden.

Wo genau liegt denn das Problem, also wo kommst Du ganz konkret nicht weiter? In der Python-Dokumentation gibt es auch ein Howto zu regulären Ausdrücken. Und ganz generell findet man zu dem Thema im Netz auch unabhängig von der Programmiersprache bestimmt eine Menge Informationen zu regulären Ausdrücken.

Ein Programm wie Kodos ist auch hilfreich wenn man solche Ausdrücke entwickelt.
archifox
User
Beiträge: 9
Registriert: Sonntag 9. November 2014, 19:55

So, es hat jetzt nach einiger Recherche und Rumprobieren geklappt! :D

Code: Alles auswählen

import time
import re

Grad = u'\xb0'

print ("Extraktion der Koordinaten: \n")
time.sleep(1)

fobj_in = open("input.txt")
fobj_out = open("Koords.txt","w")
i = 1
for line in fobj_in:
    if "OriginalPoint" in line:
        Text = re.split("\W+", line)
        Koordname = Text[0]
        Nord_Grad_dezimal = Text[3]
        Nord_Minuten_dezimal = Text[4]
        Ost_Grad_dezimal = Text[5]
        Ost_Minuten_dezimal = Text[6]
        Nord_Minuten_WSG84 = str(round(float("0." + Nord_Minuten_dezimal)*60,3))
        Ost_Minuten_WSG84 = str(round(float("0." + Ost_Minuten_dezimal)*60,3))
        fobj_out.write(Koordname + ":\n" + "N " + Nord_Grad_dezimal + Grad + " " + Nord_Minuten_WSG84 + "  E " + Ost_Grad_dezimal + Grad + " " + Ost_Minuten_WSG84 + " (N " + Nord_Grad_dezimal + "." + Nord_Minuten_dezimal + Grad + "  E " + Ost_Grad_dezimal + "." + Ost_Minuten_dezimal + Grad + ") \n \n")
    i = i + 1
fobj_in.close()
fobj_out.close()

print (" - Erfolgreich \n")
Was mich jetzt aber noch stört, ist, wenn die letzte Ziffer bei der Ausgabe in Grad.Minuten eine Null ist, diese nicht ausgegeben wird. Ich möchte aber das es z.B. so aussieht:

N 50° 34.560

und nicht

N 50° 34.56

Wie bekomme ich das hin???
Zuletzt geändert von Anonymous am Dienstag 11. November 2014, 00:09, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@archifox: Das bekommt man mit Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten hin. Dann kannst Du auch gleich `round()`, `str()`, und ``+`` damit ersetzen und das dadurch etwas lesbarer gestalten.

`i` wird nirgends verwendet. Das hätte man sowieso nicht ”von Hand” hochzählen sollen, dafür gibt es die `enumerate()`-Funktion.

`fobj_` ist ein schlechter Präfix. In Python ist alles ein Objekt, das muss man also im Namen nicht erwähnen, und Abkürzungen sollte man vermeiden. Wenn es keinen passenderen Namen gibt, der auch den Inhalt der Datei beschreibt, wäre `in_file` und `out_file` passend.

In der mit ~300 Zeichen ziemlich langen Zeile wiederholt sich Code mit leicht anderen Werten. Das hätte man vielleicht in eine Funktion herausziehen können.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@archifox: Wenn Du schon reguläre Ausdrücke benutzt, warum dann nicht einen etwas aussagekräftigeren, anstatt mit magischen Indizes zu hantieren?

Code: Alles auswählen

import re
def input_parser(lines):
    for line in lines:
        match = re.match(r'\s*([^.]+)\.OriginalPoint = ZonePoint\(([^,]+),([^,]+),[^,]+\)', line)
        if match:
            yield match.groups()
        
with open("input.txt") as in_file:
    with open("Koords.txt","w") as out_file:
        for koord_name, nord, ost in input_parser(in_file):
            out_file.write("{koord_name}:\nN {nord[0]:.0f}\xb0 {nord[1]:.3f} E {ost[0]:.0f}\xb0 {ost[1]:.3f}\n".format(
                koord_name=koord_name,
                nord = divmod(float(nord)*60, 60),
                ost = divmod(float(ost)*60, 60)
            ))
archifox
User
Beiträge: 9
Registriert: Sonntag 9. November 2014, 19:55

Erst mal vielen Dank für die Hilfe! Jetzt klappt es perfekt!

Als Anfänger sucht man sich einen Weg entsprechend der vorhandenen Kenntnisse. Klar dass es immer eine Reihe von Möglichkeiten gibt ein Problem zu lösen. Deshalb bin ich auch sehr dankbar, wenn ich durch Euch weiter Dinge dazulernen kann, und meine Scripte kompakter und übersichtlicher halten kann.

Also nochmal vielen Dank, hab wieder was dazu gelernt und arbeite mich fleissig weiter durch sämtliche Tutorials die ich finde!

Die nächste Frage steht aber schon wieder im Raum ...

Gruß archifox
Antworten