Seite 1 von 1

String-Liste auswerten

Verfasst: Sonntag 15. April 2012, 12:25
von acidbath
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

Re: String-Liste auswerten

Verfasst: Sonntag 15. April 2012, 12:35
von cofi
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 ;)

Re: String-Liste auswerten

Verfasst: Sonntag 15. April 2012, 13:19
von pillmuncher
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.

Re: String-Liste auswerten

Verfasst: Sonntag 15. April 2012, 17:55
von acidbath
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