Bestimmten Text in Datei suchen

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
MichaHo
User
Beiträge: 3
Registriert: Freitag 25. November 2016, 23:22

Hi,
ich bin neu hier im Forum und auch neu in der Sprache Python. (Bisher programmiere ich in VB.Net).
ich habe ein Verzeichnis in dem mehrere Log Dateien sind.
In der Logdatei steht irgendwo der Text 'erfolgreich abgeschlossen' oder 'mit Fehlern abgeschlossen'
Nun möchte ich gerne alle Dateien durchgehen, nach dem Text suchen und entsprechend 'OK' oder 'Nicht OK' zurück geben. (Konsole reicht mir).
Dazu habe ich folgendes Script geschrieben:

Code: Alles auswählen

from glob import glob

def suche(text,textdatei):
    if text in textdatei:
        return 'OK'
    else:
        return 'Nicht OK'

filenames = glob("C:\\Temp\\*.log")
tx='erfolgreich abgeschlossen.'
for filename in filenames:
    f = open(filename)
    print(suche(tx, f),f.name)
    f.close()
die Console gibt mir allerdings IMMER 'Nicht OK' aus obwohl der obige Text definitiv in mehreren dieser Dateien vorkommt.
Was hab ich falsch gemacht?
Vielen Dank
Grüße
Micha

EDIT:
hab es hin bekommen.

Code: Alles auswählen

print(suche(tx, f.read()),f.name)
Zuletzt geändert von Anonymous am Montag 28. November 2016, 12:05, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@MichaHo: `f` ist ein iterierbares Objekt, das die Zeilen der Textdatei inklusive Zeile-Ende-Zeichen liefert. Ein `text in textdatei` liefert also nur wahr, wenn der Text exakt einer Zeile der Textdatei entspricht.

Was Du wahrscheinlich möchtest, ist das Suchen des Substrings `text` innerhalb der gesamten Datei, also:

Code: Alles auswählen

def suche(text,textdatei):
    if text in textdatei.read():
        return 'OK'
    else:
        return 'Nicht OK'
Du vermischst deutsche und englische Namen, entscheide Dich für eine Sprache. `suche` beschreibt nicht genau das, was die Funktion macht. Auch würde ich erwarten, dass eine solche Funktion keinen String als Ergebnis liefert sondern True/False. Vermeide Abkürzungen, tx oder f helfen nicht beim Verstehen, wofür die Variablen benutzt werden. Öffne Dateien mit dem with-Statement:

Code: Alles auswählen

from glob import glob

def contains(text, textfile):
    return text in textfile.read()

filenames = glob("C:/Temp/*.log")
search_text = 'erfolgreich abgeschlossen.'
for filename in filenames:
    with open(filename) in textfile:
        print("OK" if contains(search_text, textfile) else "Nicht OK", textfile.name)
MichaHo
User
Beiträge: 3
Registriert: Freitag 25. November 2016, 23:22

Hi,
Vielen Dank für Deine Hinweise.
Dein Code liefert mir bei

Code: Alles auswählen

with open(filename) in textfile:
bei textfile einen Fehler.
Muss textfile nicht irgendwo deklariert werden?

EDIT:
OK, gerade nochmal 'with' nachgeschlagen.
es muss:

Code: Alles auswählen

with open(filename) as textfile
heissen.
Der Code klappt super und ich hab was gelernt :-)
Danke Dir
Zuletzt geändert von MichaHo am Montag 28. November 2016, 12:02, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@MichaHo: es muß ja auch `with open(filename) as textfile:` heißen und nicht `in` :oops:
MichaHo
User
Beiträge: 3
Registriert: Freitag 25. November 2016, 23:22

@Sirius3: mein Edit hat sich gerade überschnitten... Danke Dir :D
Antworten