Ausgabe beim Parsen gruppieren

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
91Faty
User
Beiträge: 1
Registriert: Dienstag 25. April 2017, 08:13

Hallo Leute,

ich habe eine Log-Datei geparst und in eine externe Datei geschrieben. Will jedoch alles gruppenweise ausgeben bzw. schreiben, weil die ausgaben ata1, ata2 usw. durcheinander in die Datei geschrieben werden.
Hier ein Abschnitt vom Code:

Code: Alles auswählen

import re

class Log:
    rdatei = open('messages', 'r')
    wdatei = open('fehler.txt', 'w')

    for line in rdatei:

        if re.search('ata1\S', line):
            print('Datum: '+line[0:15],'[Timer: '+line.split(':[')[1])
            wdatei.write('--> Datum: '+str(line[0:15])+' [Timer: '+str(line.split(':[')[1]))

        if re.search('ata2\S', line):
            print('Datum: '+line[0:15],'[Timer: '+line.split(':[')[1])
            wdatei.write('--> Datum: '+str(line[0:15])+' [Timer: '+str(line.split(':[')[1]))
Zuletzt geändert von Anonymous am Dienstag 25. April 2017, 08:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@91Faty: Dann musst Du die Daten erst im Speicher sammeln und Gruppieren. Was Du dazu brauchst ist eine Abbildung von den Suchbegriffen zu einer Liste mit den Ausgaben. Also grundsätzlich ein Wörterbuch. Etwas weniger Code wird man mit einem `collections.defaultdict` brauchen, weil man sich dann sparen kann den Unterschied zwischen Schlüsseln zu machen die bereits vorhanden sind, und solchen die neu sind.

Was soll das ``class Log:``? Das ist keine Klasse!

Du hast da übrigens zweimal fast identischen Code stehen — so etwas macht man nicht. Da zieht man die gemeinsamen Daten heraus undverwendet eine Schleife und/oder eine Funktion. Innerhalb des sich wiederholenden Codes ist ebenfalls Code der sich wiederholt.

`line` ist eine Zeichenkette, also sind auch Teilstücke davon Zeichenketten. Was denkst Du was ein `str()`-Aufruf mit einer Zeichenkette als Argument bewirken soll?

Zeichenketten mit `str()` und ``+`` zusammensetzen ist eher BASIC als Python. In Python gibt es dafür die `format()`-Methode auf Zeichenketten.

Dateien die man öffnet, sollte man auch wieder schliessen. Die ``with``-Anweisung ist da praktisch.

Damit komme ich beim bisherigen Code ungefähr hier an (ungetestet):

Code: Alles auswählen

import re


def main():
    with open('messages', 'r') as log_lines:
        with open('fehler.txt', 'w') as out_file:
            for line in log_lines:
                for pattern in [r'ata1\S', r'ata2\S']:
                    if re.search(pattern, line):
                        message = 'Datum: {} [Timer: {}'.format(
                            line[0:15], line.split(':[', 1)[1]
                        )
                        print(message)
                        out_file.write('--> ' + message)


if __name__ == '__main__':
    main()
Das ist ziemlich tief verschachtelt und damit ein Warnzeichen, dass man das vielleicht besser auf mehrere Funktionen aufteilen sollte. Zwei übliche Trennlinienen an denen man diese Art von Programmen aufteilt sind zwischen Eingabe und Verarbeitung und Verarbeitung und Ausgabe. Also das man beispielsweise die Eingabe in eine Funktion steckt, im Hauptprogramm dann den Rückgabewert dieser Funktion in eine Datenstruktur überführt (hier die Abbildung Muster→geparste Zeilen) und diese Datenstruktur dann einer Funktion übergibt die die Daten in die Ergebnisdatei schreibt.
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Dann sammele doch die Infos von ata1 und ata2 in zwei getrennten Listen.
Sobald du die Log durchgegangen bist kannst du jede Liste separat printen und anschließend wegschreiben.
Antworten