Ausgabe eines Wortes anstelle der Zeile

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
TheBombTuber
User
Beiträge: 49
Registriert: Samstag 9. September 2017, 15:48

Hallo,

Ich bin noch ziemlich unerfahren in dem Umgang mit Python und komme momentan nicht wirklich weiter.

Ich habe folgendes Problem:
Ich muss aus einer Textdatei ein bestimmtes Wort suchen.

Dies habe ich mit folgendem Code gelöst:

Code: Alles auswählen

import os
os.path.abspath(os.path.dirname(r'\Pfad'))

liste = open(r"Fügegruppen.xml", "r")
ausgabe = open(r"Fügegruppen_Ausgabe.xml", "w")
suche = "Fügegruppe ["

def test_a():
    for i in liste:
        while True:
            if suche in i:
                ausgabe.write(i.strip() + '\n')
                
            else:
                break
            break

test_a()
liste.close()
ausgabe.close()
Mein Problem ist jetzt, dass ich die Gesamte Zeile ausgegeben bekomme.

Wie muss ich den Code umschreiben um hier wirklich nur das gesuchte Wort ausgegeben zu bekommen?

Eine Weitere Problematik ist, dass sich hinter dem Suchwort noch bis zu 7 andere Zeichen befinden (Beispiel: Fügegruppe [000_0] oder Fügegruppe [0000_0]) welche mit ausgegeben werden müssen.
Wie lässt sich das Umsetzen?

Vielen Dank schon einmal im Voraus.
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du gibst halt die Zeile (mit dem aeusserst schlecht gewaehlten Bezeichner "i". Das macht das verstehen des Codes unnoetig schwer) aus. Gib doch die suche aus, dann hast du dein Wort.

Bezueglich der Ausgabe der nachfolgenden Zeichen: du kannst entweder regulaere Ausdrueck verwenden, um dein Muster zu finden. Das ist fuer viele aber sehr schwer zu Beginn. Ein anderer Ansatz besteht darin, ausgehend von der Position an der du deine suche gefunden hast in der Zeile einfach nach dem schliessenden ] zu suchen, und dann den Ausschnitt aus der Zeile auszugeben. Dafuer brauchst du statt dem "in"-operator die "index"-Methode auf der Zeile.

Last but not least: die innere while-schleife ist komplett ueberfluessig und du solltest sie entfernen. Sie tut genau nix, und ist schlimmstenfalls verwirrend.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Eine Anmerkung: Die Dateiendungen deuten auf XML hin. Zwar kann man XML theoretisch wie einfachen Text behandeln und darin suchen und manchmal ist das auch die schnellste Variante, so allgemein ist das aber eher fehleranfällig und nicht zu empfehlen. Wenn es sich wirklich um XML handelt, könntest du daher schauen, ob du die Datei nicht zum Beispiel mit lxml.etree parsen und die gewünschten Informationen per xpath auslesen kannst. Wenn du dir da unsicher bist, könntest du auch einen kurzen Ausschnitt aus der Datei zeigen.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheBombTuber: ich würde das sogar schärfer formulieren als nezzcarth: XML-Dateien sind keine Text-Dateien. Dass da irgendwas zusammen in einer Zeile steht, oder dass da nicht irgendwelche Kodierungen enthalten sind, kann man nicht garantieren. Gerade wenn `ü` vorkommen stehen die oft als `ü` in der Datei. Daher XML-Dateien immer mit einem passenden Parser (ElementTree oder eben das angesprochene lxml) lesen. Die Ausgabe ist garantiert kein XML mehr, und sollte daher auch nicht diese Endung haben.

Sonstige Anmerkungen zum Code: die zweite Zeile ist wirkungslos und kann weg. Funktionen sollten alles, was sie an Eingaben brauchen, über ihre Parameter bekommen, hier also suche, liste und ausgabe. Eine while-Schleife, die immer per break verlassen wird, kann weg. `i` ist ein sehr schlechter Name für eine Zeile. `test_a` ist auch ein schlechter Name für eine Funktion. Um ein Programm verstehen zu können, sind aussagekräftige Namen essentiell. Dadurch sieht man auch, ob man das Problem verstanden hat, z.B. dass die for-Schleife Zeilen liefert.
Antworten