Seite 1 von 1

Text aus Datei einlesen und umformatiert in Datei ausgeben

Verfasst: Sonntag 9. November 2014, 20:27
von archifox
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

Re: Text aus Datei einlesen und umformatiert in Datei ausgeb

Verfasst: Sonntag 9. November 2014, 20:44
von 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.

Re: Text aus Datei einlesen und umformatiert in Datei ausgeb

Verfasst: Dienstag 11. November 2014, 00:07
von archifox
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???

Re: Text aus Datei einlesen und umformatiert in Datei ausgeb

Verfasst: Dienstag 11. November 2014, 00:17
von 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.

Re: Text aus Datei einlesen und umformatiert in Datei ausgeb

Verfasst: Dienstag 11. November 2014, 09:03
von Sirius3
@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)
            ))

Re: Text aus Datei einlesen und umformatiert in Datei ausgeb

Verfasst: Samstag 15. November 2014, 16:34
von archifox
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