Seite 1 von 1

Zeilenweise Einlesen, auf (über)nächste Zeilen zugreifen.

Verfasst: Dienstag 11. September 2007, 14:16
von xoxox
Hallo,

ich möchte in einer Textdatei nach einer bestimmten Zeile suchen und eine Zeile weiter den Inhalt dieser Zeile verarbeiten.

Warum funktioniert dieser Code nicht?

Code: Alles auswählen

with open(filename,'r') as f:
    for i in f:
        if i == 'text':
            f.next()
            print i
Ich erwarte dass mit "print i" die Zeile nach der gematchten Zeile ausgegeben wird!? Tut's aber nicht, es bleibt die aktuelle Zeile. Es kann doch nicht sein, dass ich den gesamten Text einlesen und dann mit Listenindices arbeiten muss.

Re: Zeilenweise Einlesen, auf (über)nächste Zeilen zugreifen

Verfasst: Dienstag 11. September 2007, 15:04
von Leonidas
Hallo xoxox, willkommen im Forum,

der Code müsste eher so (ungetestet) aussehen:

Code: Alles auswählen

with file(filename,'r') as fh:
    lastline = str()
    for line in fh:
        if lastline = 'text':
            print line
        lastline = line
(d.h. du arbeitest mit einem Linecache) Es gibt aber auch andere Wege wie man das Lösen kann, zum Beispiel kann man auch alle Zeilen in eine Liste einlesen.

Verfasst: Dienstag 11. September 2007, 15:11
von BlackVivi
So funktionierts bei mir ... Außer wenn in der letzten Zeile ein Text enthalten ist, dass muss man halt noch "handlen"...

Code: Alles auswählen

with file("foo.txt", "r") as fl:
    for i in fl:
        if "text" in i:
            print fl.next()
Edit: So zum beispiel...

Code: Alles auswählen

with file("foo.txt", "r") as fl:
    for i in fl:
        if "text" in i:
            try:
                print fl.next(),
            except StopIteration:
                print "Dokumentenende..."

Verfasst: Mittwoch 12. September 2007, 08:08
von xoxox
Danke erstmal für die Antworten.

Ich habe mir jetzt folgende Lösung überlegt, um beliebige Zeilen nach einer gematchten Zeile auszugeben.

Code: Alles auswählen

    with open(filename,'r') as f:
        line_pitch = 3
        linenumber = -line_pitch-1

        for line in enumerate(f):
            if line[0] == linenumber+line_pitch:
                print line[1]
            if 'Suchtext' in line[1]:
                linenumber = line[0]
Das funktioniert, ist aber imho ziemlich "unphytonisch".
Gibt es wirklich kein bessere Lösungen?

Verfasst: Mittwoch 12. September 2007, 08:26
von BlackJack
Also "pythonischer" wäre es auf jeden Fall Namen statt Indexzugriffe zu verwenden:

Code: Alles auswählen

    with open(filename, 'r') as lines:
        line_pitch = 3
        linenumber = -line_pitch-1

        for i, line in enumerate(lines):
            if i == linenumber + line_pitch: 
                print line
            if 'Suchtext' in line:
                linenumber = i
Ich hätte es etwas anders arrangiert, aber vom Prinzip genauso gelöst:

Code: Alles auswählen

        line_offset = 3
        wanted_line_number = None
        for i, line in enumerate(lines)
            if i == wanted_line_number:
                print line
            if 'Suchtext' in line:
                wanted_line_number = i + line_offset