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

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.
xoxox
User
Beiträge: 12
Registriert: Dienstag 11. September 2007, 13:51

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

Beitragvon xoxox » Dienstag 11. September 2007, 14:16

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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

Beitragvon Leonidas » Dienstag 11. September 2007, 15:04

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Dienstag 11. September 2007, 15:11

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..."
xoxox
User
Beiträge: 12
Registriert: Dienstag 11. September 2007, 13:51

Beitragvon xoxox » Mittwoch 12. September 2007, 08:08

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?
BlackJack

Beitragvon BlackJack » Mittwoch 12. September 2007, 08:26

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder