Frage zu .split("=")

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
New_To_Tha_Game
User
Beiträge: 2
Registriert: Freitag 22. März 2024, 21:56

Hallo Liebe Community,

ich bin absoluter Programmierneuling und möchte ein wenig Python lernen. Als erstes Proljekt möchte ich eine Liste (.txt Datei) nach bestimmten Schlagwörtern durchsuchen und diese abspeichern. Dieses Funktioniert auch soweit.

anbei mein Code:

-> hier werden alle Zeilen nach ($TC_TP2) durchsucht und in TP2.txt geschrieben (funktioniert)

original = open("M3MAG.txt", "r")
ziel = open("TP2.txt","w")
for line in original:
if "$TC_TP2" in line:
ziel.write(line)
original.close()
ziel.close()

-> hier werden alle Zeilen nach ($TC_MPP) durchsucht und in MPP.txt geschrieben (funktioniert)

original_2 = open("M3MAG.txt", "r")
ziel_2 = open("MPP.txt","w")
for line in original_2:
if "$TC_MPP6" in line:
ziel_2.write(line)
original_2.close()
ziel_2.close()

nun zu meinem Problem:
so sieht MPP.txt aus

$TC_MPP6[1,32]=8
$TC_MPP6[1,4]=9
$TC_MPP6[1,2]=10
$TC_MPP6[1,14]=18

nun möchte ich Zeile für Zeile alles was hinter dem Gleichzeichen steht extrahieren und in Trennen_MPP.txt schreiben.
Problem ist anscheinend das line.split("=) eine Liste ausgibt und ich diese nicht einfach so in ziel_3 schreiben kann.
Also mein Ansatz, die Liste Zeile für Zeile durchzugehen und dann zu schreiben. Deshalb die For Schleife mit line_2 in der For Schleife line.
Leider ohne Erfolg.

original_3 = open("MPP.txt", "r")
ziel_3 = open("Trennen_MPP.txt","w")
for line in original_3:
ergebnis = line.split("=")
for line_2 in ergebnis
ergebniszeile=line_2
ziel_3.write(ergebniszeile)
#print(ergebnis)
original_3.close()
ziel_3.close()

Ich hoffe meine Beschreibung ist verständlich und ihr könnt mir helfen. Es gibt mit Sicherheit elegantere Methoden für erfahrene Programmierer das Ganze zu lösen.
Jedoch ist es für mich einfacher das Programm Schritt für Schritt aufzubauen und nach und nach zu verbessern.

Danke vorab.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@New_To_Tha_Game: Einrückung ist wichtig in Python, darum muss man Quelltexte in Code-Tags setzen, damit die Einrückung hier im Forum erhalten bleibt.

Dateien sollte man wenn möglich mit der ``with``-Anweisung öffnen. Dann wird sie geschlossen wenn der Programmfluss den ``with``-Block verlässt, egal aus welchem Grund. Also beispielsweise auch wenn eine Ausnahme auftritt.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben. Wenn man das nicht macht, ist die ”geratene” Kodierung vom System und dessen Einstellungen abhängig und muss nicht korrekt sein.

Man nummeriert keine Namen. Entweder will man sich dann bessere Namen ausdenken, oder gar keine Einzelnamen und -werte sondern eine Datenstruktur. Oft eine Liste. Hier aber einfach nicht immer neue Namen.

Du willst doch gar nicht alles aus der Liste in die Zieldatei schreiben, sondern wenn ich das richtig verstanden habe, nur den Teil nach dem Gleichheitszeichen. Das wievielte Element der Liste ist das denn? *Das* musst Du schreiben.

Den Wert von `line_2` auch noch an den Namen `ergebniszeile` zu binden macht keinen Sinn. Entweder bleibt das bei `line_2` oder sollte gleich `ergebniszeile` heissen, ohne das erst an `line_2` zu binden.

Die beiden ersten Codeschnippsel machen das gleiche, nur mit leicht anderen Werten. So etwas schreibt man nicht zweimal hin, sondern schreibt eine Schleife und/oder eine Funktion, welche die Werte die sich Unterscheiden als Argumente übergeben bekommt.

Statt `split()` würde man hier eher `partition()` verwenden. Oder `split()` sagen das maximal einmal aufgetrennt werden soll.

Auch wenn Du sagst Du willst das Schrittweise aufbauen: Unnötige Dateien mit Zwischenergebnissen macht man nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@New_To_Tha_Game: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Mit einer Funktion um die Codewiederholung bei den ersten beiden Blöcken loszuwerden, könnte das so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3

ENCODING = "utf-8"


def filter_file(
    source_filename, target_filename, search_term, encoding=ENCODING
):
    with open(source_filename, "r", encoding=encoding) as lines:
        with open(target_filename, "w", encoding=encoding) as file:
            file.writelines(line for line in lines if search_term in line)


def main():
    original_filename = "M3MAG.txt"
    filter_file(original_filename, "TP2.txt", "$TC_TP2")
    filter_file(original_filename, "MPP.txt", "$TC_MPP6")

    with open("MPP.txt", "r", encoding=ENCODING) as lines:
        with open("Trennen_MPP.txt", "w", encoding=ENCODING) as file:
            file.writelines(line.partition("=")[2] for line in lines)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
holger47110815
User
Beiträge: 12
Registriert: Sonntag 17. März 2024, 19:24

@New_To_Tha_Game: Vielleicht kann Dir dieses Stück Code weiterhelfen.

Gruß
Holger

Code: Alles auswählen

from pathlib import Path


def trennen(file: Path, tp2: list, mpp: list) -> bool:
    if Path(file).is_file():

        with open(file, "r", encoding='utf8') as f:
            lines = f.read().split("\n")

        for line in lines:

            if line.find('TC_TP2') > -1:
                tp2.append(line)

            if line.find('TC_MPP6') > -1:
                mpp.append(line)

        return True

    else:

        return False


if __name__ == '__main__':

    tp2_list = []
    mpp_list = []
    in_file = Path("M3MAG.txt")

    if not trennen(in_file, tp2=tp2_list, mpp=mpp_list):
        print(f'Die Datei {in_file} existiert nicht')
        exit()
    else:
        with open("TP2.txt", "w", encoding='utf8') as f:
            for line in tp2_list:
                f.write(f'{line}\n')

        with open("MPP.txt", "w", encoding='utf8') as f:
            for line in mpp_list:
                f.write(f'{line}\n')

        with open("Trennen_MPP.txt", "w", encoding='utf8') as f:
            for line in mpp_list:
                f.write(f'{line.split("=")[1]}\n')
holger47110815
User
Beiträge: 12
Registriert: Sonntag 17. März 2024, 19:24

__blackjack__ hat geschrieben: Samstag 23. März 2024, 14:45 @New_To_Tha_Game: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

...
Uuups, da war ich wohl zu langsam ;-)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@holger47110815: mit `file` meint man normalerweise ein Fileobjekt und keinen Pfadnamen. Argumente sollten auch aussagekräftig sein, tp2 und mpp sind das nicht.
Das Prüfen, ob die Datei eine Datei ist, bringt wenig, weil es noch etliche weitere Fehler beim Lesen einer Datei geben kann. Am besten öffnet man einfach die Datei und fängt im Fehlerfall die Exception ab.
Erst die ganze Datei als String zu lesen, um sie anschließend in Zeilen aufzuspalten ist umständlich, wenn man gleich über die Zeilen der Datei iterieren könnte.
find benutzt man eigentlich nie, erst recht nicht, wenn man den viel sprechenderen in-Operator benutzen könnte.
Listen als Argument zu übergeben, damit diese dann gefüllt werden, ist ungewöhnlich, einfach die Listen innerhalb der Funktion erzeugen und zurückgeben wäre der bessere Weg.
`exit` hat in einem normalen Programm nichts verloren, das Programm endet auf normalem Weg, wenn die main-Funktion endet.

Code: Alles auswählen

def trennen(path):
    tp2_lines = []
    mpp6_lines = []
    with path.open(encoding='utf8') as lines:
        for line in lines:
            if 'TC_TP2' in line:
                tp2_lines.append(line)
            if 'TC_MPP6' in line:
                mpp6_lines.append(line)
    return tp2_lines, mpp6_lines


def main():
    path = Path("M3MAG.txt")
    try:
        tp2_lines, mpp6_lines = trennen(path)
    except IOError as error:
        print(f"Fehler beim Lesen der Datei {path}: {error}")
    else:
        with open("TP2.txt", "w", encoding='utf8') as file:
            file.writelines(tp2_lines)

        with open("MPP.txt", "w", encoding='utf8') as file:
            file.writelines(mpp6_lines)

        with open("Trennen_MPP.txt", "w", encoding='utf8') as file:
            for line in mpp6_lines:
                _, _, value = line.partition("=")
                file.write(value)

if __name__ == "__main__":
    main()
New_To_Tha_Game
User
Beiträge: 2
Registriert: Freitag 22. März 2024, 21:56

Hallo,

vielen herzlichen Dank an alle die sich die Mühe gemacht haben mir weiterzuhelfen. Bekanntlich führen viele Wege nach Rom :-).
So werde ich die Beiträge von oben nach unten abarbeiten und mit Sicherheit in Zusammenarbeit mit Google zum Ziel kommen.

Beste Grüße
holger47110815
User
Beiträge: 12
Registriert: Sonntag 17. März 2024, 19:24

Sirius3 hat geschrieben: Samstag 23. März 2024, 16:57 @holger47110815: mit `file` meint man normalerweise ein Fileobjekt und keinen Pfadnamen. Argumente sollten ...

Code: Alles auswählen

def trennen(path):
    tp2_lines = []
    mpp6_lines = []
    with path.open(encoding='utf8') as lines:
        for line in lines:
        ...

Wieder was gelernt. Danke Dir!
Antworten