Code Ausschnit

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
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

Hallo,

Ich brauche eine funktion, welche grob zusammengefasst, einen Code-ausschnitt einer datei liefert.

Probiert habe ich bisher folgendes, welches aber leider absolut garnicht funktioniert, manchmal ist `prev` gleich der komplette dateikopf, ein anderes mal ist `mainline` nicht mit der eigentlich haupt-line identisch..

Code: Alles auswählen

def getsection(filepath, line, maxprev=6, maxafter=6):
    try:
        data = readitem(filepath)
        lines = data.split('\n')
        mainline = lines[line+2]
        prev = lines[:line] #[maxprev:]
        after = lines[line:][:maxafter]
        return linesprev, mainline, linesafter
    except IOError:
        return False
Die oben gezeigte Funktion gibt die zeilen als Liste wieder, was das weiter-verarbeiten in Templates wesentlich vereinfacht. Leider funktioniert es, wie gesagt, nur nicht... Ich hoffe es ist klar was ich mein =)
BlackJack

Viel zu wenig Information. Das Problem könnte ja genau so gut in `readitem()` liegen.

Und vielleicht experimentierst Du einfach mal mit einer Liste in einer Python-Shell um ein Gefühl für's "slicing" zu bekommen.
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

BlackJack hat geschrieben:Viel zu wenig Information.
Die funktion soll, beispielsweise, aus folgendem Ausschnitt folgendes extrahieren (die nummern sind nur eine gedankliche stütze):

Code: Alles auswählen

import fubar
import sonderbar
import wunderbar
import etcetera

class FooBar:
    def main(self):
        print("Hallo Welt!")

    def __init__(self):
        pass

if __name__ == '__main__':
    foobar = FooBar()
    foobar.main()
extrahiert:

Code: Alles auswählen

7:      def main(self):
8:          print("Hallo Welt!")
9:
10:     def __init__(self):
11:         pass
12:
13: if __name__ == '__main__':
Das Problem könnte ja genau so gut in `readitem()` liegen.
Nö:

Code: Alles auswählen

def readitem(item):
    out = ''
    with open(item) as f:
        data = f.read()
        out += data
    return out
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Erstens kannst du deine `readitem`-Funktion viel einfacher gestalten (und besser benennen) und zweitens müsste folgende Variante von `getsection` dir die Zeile vor und nach der gewünschten Zeile (wo die 1. Zeile 0 ist) liefern. Der ursprüngliche Code kann schon daher nicht funktionieren, da `linesprev` und `linesafter` nicht definiert sind.

Code: Alles auswählen

def readlines(filename):
    with open(filename) as f:
        return f.readlines()

def getsection(filename, line):
    lines = readlines(filename)
    return lines[line-1:line+2]
Stefan
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

sma hat geschrieben:Erstens kannst du deine `readitem`-Funktion viel einfacher gestalten (und besser benennen) und zweitens müsste folgende Variante von `getsection` dir die Zeile vor und nach der gewünschten Zeile (wo die 1. Zeile 0 ist) liefern. Der ursprüngliche Code kann schon daher nicht funktionieren, da `linesprev` und `linesafter` nicht definiert sind.
das war kaputte copypasta, nix weiter.

Code: Alles auswählen

def readlines(filename):
    with open(filename) as f:
        return f.readlines()

def getsection(filename, line):
    lines = readlines(filename)
    return lines[line-1:line+2]
Stefan
mit dem unterschied, dass meine funktion nur eine bestimmte anzahl an vorher-nachher zeilen wiedergab, dein code gibt *alle* zeilen vor und nach der zeile wieder.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

stuhlbein hat geschrieben:mit dem unterschied, dass meine funktion nur eine bestimmte anzahl an vorher-nachher zeilen wiedergab, dein code gibt *alle* zeilen vor und nach der zeile wieder.
Deine Anforderung wird von smas Funktion zwar nicht erfuellt, ist aber leicht nachzutragen. Seine Funktion macht aber auch nicht das was du behauptest, sondern gibt die Zeile und die folgenden 2 aus.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

SMAs Funktion gibt die Zeile vor und die Zeile nach der gewünschten Zeile aus, extrahiert damit einen Ausschnitt und macht damit das, was ich verstanden habe, dass stuhlbein machen will. Die Zahl der umgebenden Zeilen anzupassen, sollte ja wohl für jeden selbst möglich sein.

Stefan
Antworten