String-Liste auswerten

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
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Moin allerseits.

Ich lese hier jetzt schon seit einiger Zeit mit, weil ich mich mit dem Gedanken trage, irgendwann (womöglich noch in diesem Leben? 8) ) Python zu erlernen.
Jetzt hatte ich mich eben an eine kleine Aufgabe gesetzt, die das Auslesen und Interpretieren des Inhalts einer PDF-Datei beinhaltet.
Zum Auslesen des Textes verwende ich pdfminer, was soweit auch funktioniert.
Zurückgeliefert bekomme ich einen String, den ich mit ".split(‘\n')" in einzelne Zeilen unterteile.
Ziel ist es jetzt, aus dieser Liste von Strings einen bestimmten Abschnitt herauszulösen.

Vielleicht zunächst einmal mein bisheriger Code:

Code: Alles auswählen

...
zeilen = ausgabe.getvalue()
liste = zeilen.split('\n')
zeile = 0

while zeile < len(liste):
    if liste[zeile].startswith('flight date'):
        zeile += 1
        break
    zeile += 1
    
print zeile
print liste[zeile:]
So bekomme ich also die Zeile geliefert, die auf die Zeile, die mit 'flight date' beginnt, folgt. Da die Daten, die mich interessieren, schon vor dem Ende der Liste aufhören, könnte ich es genauso mit dem Ende machen: mit while durchlaufen und dann schließlich mit liste[Anfang:Ende] darauf zugreifen. (Was ich vorerst komplett außer Acht gelassen habe, ist natürlich die Überprüfung, ob überhaupt sinnvolle Daten vorhanden sind - aber das soll mal nicht Thema dieses Posts sein.)
Aber irgendwie drängt sich mir der Eindruck auf, daß dies alles andere als elegant ist. Meist gibt es ja doch einen 'python way', der weitaus schöner, kürzer und - nach kurzem Nachdenken - auch intuitiv ist.
Einzig: ich komme nicht drauf. Könnte mich bitte jemand erleuchten? :D

Dank und Gruß,
Daniel
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im (aktiven) Forum!

Schritt 1: Werde ueberfluessige indizes los:

Code: Alles auswählen

lines = ausgabe.getvalue().split('\n')
relevant = False
info = []
for line in lines:
    if relevant:
        info.append(line)
    relevant = relevant or line.startswith('flight date')
Schritt 2 waere das einpacken in eine sinnvolle Funktion (die auf den Daten und nicht auf diesem `ausgabe` Objekt arbeitet).
Schritt 3 bis n finden sich dann schon ;)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Oder mit einem Iterator:

Code: Alles auswählen

lines = iter(['a', 'b', 'flight date hallo', 'c', 'd', 'done', 'e', 'f'])

for line in lines:
    if line.startswith('flight date'):
        break

for line in lines:
    if line == 'done':
        break
    print line
Ergebnis: Meine erste Idee war dies hier:

Code: Alles auswählen

from itertools import dropwhile, takewhile

lines = ['a', 'b', 'flight date hallo', 'c', 'd', 'done', 'e', 'f']
lines = takewhile(lambda s: s != 'done',
                  dropwhile(lambda s: not s.startswith('flight date'),
                            lines))

for line in lines:
    break

for line in lines:
    print line
Aber es ist irgendwie wenig übersichlich.
In specifications, Murphy's Law supersedes Ohm's.
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Vielen Dank euch beiden für die schnellen Antworten!

Ich habe mich für die iter-Variante entschieden - sieht irgendwie am schönsten aus und kommt ohne Hilfsvariable aus; sorry cofi. :wink:
Wobei ich mir die iter-Geschichte überhaupt erst einmal anschauen mußte. Unwissend wie ich bin verstand ich den Unterschied zunächst nicht zwischen der Liste, die ja auch iterierbar ist (nach meinem Verstädnis wohlgemerkt! :) ), und dem iter-Objekt. Sehr praktisch das.
@cofi: Stimmt, Schritt 2 und 3 stehen noch an, wobei ich n>3 mal ausschließen möchte, dies sollte nur eine Fingerübung sein, um endlich mal mit Python anzufangen.

Schönen Abend noch,
Daniel
Antworten