Schlüsselwort in Liste suchen und Bereich extrahieren

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
Ekki
User
Beiträge: 2
Registriert: Sonntag 28. Februar 2021, 10:02

Hallo zusammen,

als "alter" Programmierer habe ich so meine Probleme mit der doch ziemlich anderen Python-Herangehensweise.

In einer Textdatei ist in einer bestimmten Zeile ein Schlüsselwort. In den folgenden Zeilen stehen die interessanten Daten, bis eine Leerzeile folgt.
Klassisch würde ich mit dem Zeilenindex arbeiten

Code: Alles auswählen

do
	i++
loop until ...Schlüsselwort
do
	kopiere ...
	i++
loop until ... Leerzeile
Wie macht man sowas sauber in Python? Kann man auch mit einem Index arbeiten oder ist das 'verpönt'?
Kann ich alternativ aus einer Liste bestimmte Werte löschen?
Oder macht man das so:

Code: Alles auswählen

looking_for_data = true
is_data = false

for zeile in text:
	if is_data:
		if ...Leerzeile:
			is_data = false
		else:
			...kopieren

	if looking_for_data:
 		if  'keyword' in zeile:
 			looking_for_data = false
 			is_data=true
 			
Oder gibt es da was viel eleganteres?

Danke!
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Code sieht doch schon ganz gut aus. Er benutzt keinen Index. Nur die vielen Flags stören noch. Warum nimmst du nicht zwei Schleifen, wie in deinem Pseudocode?

Code: Alles auswählen

iterator = iter(text)
for zeile in iterator:
    if keyword in zeile:
        break
for zeile in iterator:
    if zeile.strip() == "":
        break
    ... 
Natürlich gibt es für solche Standardaufgaben etwas fertiges:

Code: Alles auswählen

from itertools import dropwhile, takewhile
iterator = dropwhile(lambda s: keyword in s, text)
_ = next(iterator)
iterator = takewhile(lambda s: s.strip() != "", iterator)
for zeile in iterator:
    ... 
Sirius3
User
Beiträge: 17760
Registriert: Sonntag 21. Oktober 2012, 17:20

PS: noch besser ist es, erst gar nicht nach einem Schlüsselwort suchen zu müssen, sondern die Daten schon in einer passenden Datenstruktur zu speichern (Wörterbuch).
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn man das Ergebnis von strip() nur braucht, um gegen die leere Zeichenkette zu prüfen, kann man alternativ auch isspace() nutzen...
Ekki
User
Beiträge: 2
Registriert: Sonntag 28. Februar 2021, 10:02

1000 Dank für die schnelle Antwort!
Es gibt ja unendlich viele Bibliotheken. Muss man ja auch erst mal wissen, dass es sowas gibt. Oder eben hier den Tipp bekommen.

Und lambda kannte ich auch noch nicht. Wieder was gelernt!
Danke!
Antworten