2017-06-20 2 views
0

Hey, ich schreibe ein Programm, das durchsucht werden soll .log-Dateien und finde ein Stichwort "Complete Respons". Alle gefundenen Schlüsselwörter sollten später geschrieben und in einer neuen .txt-Datei gespeichert werden. Ich habe jetzt das Programm verwaltet, um ein Dokument zu der Zeit zu durchsuchen, aber ich habe +50 Dokumente des gleichen Typs in einem Verzeichnis, das ich gleichzeitig durchsuchen und alle gefundenen Schlüsselwort in demselben .txt Dokument setzen möchte . Ich könnte wirklich Hilfe gebrauchen ...! DankPython - Stichwortsuchprogramm

def read_log_file(filename, keyword): #file 

    saved_word = [] # Array 
# read file 
    with open(filename) as file_search: #open search file 
     file_search = file_search.readlines() #read file 
    for lines in file_search: # every word is scaned 
      if keyword in lines: # extract the keyword 
       saved_word.append(lines) #store all found keywords in array 
     # write in new file 
    with open('CompleteResponse.txt', 'w') as file_handler: 
     file_handler.write(f"{filename}\n") 
     for i in range(len(saved_word)): 
      file_handler.write(f"{saved_word[i]}") 

    print('done') # completed 

    print(len(saved_word)) # count found words 

read_log_file(r'C:\Users\\Documents\read_log_files\test.log', 'Complete Response:') 
+0

Bitte Detail die Frage: Haben Sie Probleme? Ausnahmen? – pinturic

+1

@fili: Die Antwort von @Shai wird dich dorthin bringen. Nur ein paar Kommentare zu deinem Code: 'for lines in file_search' - warum der Plural? tun 'für Zeile in file_search', auch nicht in der Gewohnheit von' file_search = file_search.readlines() ', da dies den Typ von' file_search' ändert und zu kleinen Fehlern führen kann. Schließlich sind 'file_search' und' file_handler' seltsame Namen. Und wenn die Protokolldateien groß werden, möchten Sie möglicherweise vermeiden, sie alle in einem Array zu lesen und nur Zeile für Zeile zu verarbeiten. –

Antwort

3

Öffnen Sie die Ausgabedatei 'CompleteResponse.txt' in Modus anzuhängen, statt Schreib:

with open('CompleteResponse.txt', 'a') as file_handler: 

Dann ist Ihre Funktion in einer Schleife aufrufen:

import glob 
for filename in glob.glob('C:\Users\\Documents\read_log_files\*.log'): 
    read_log_file(filename, 'Complete Response:') 

tun sollten der Trick für dich.

Sie können eine detaillierte Liste der Dateiöffnungsmodi here finden.


PS,
Wenn Sie diese Funktion aufrufen, mehrmals die Absicht, die Ausgabedatei 'CompleteResponse.txt' werden alle Ergebnisse (Verkettung aller Ausgaben von ALL läuft) enthalten.
dies zu vermeiden, möchten Sie vielleicht auf „reset“, um die Datei vor Verarbeitung aller Protokolldateien:

with open('CompleteResponse.txt', 'w') as file_handler: 
    pass # open with 'w' to "reset" the file. 
+0

Löschen Sie die Datei am Ende des Skripts ??? – cdarke

+0

@cdarke - Ich guss "die Datei zurücksetzen" ** bevor ** ist passender .. – Shai

+1

@Shai Vielen Dank, es funktioniert genau wie ich es wollte! – fili