Postfix-Log-Analyser

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
johnny08
User
Beiträge: 3
Registriert: Mittwoch 29. Juni 2011, 16:22

Hi an alle,

ich bin neu hier und möchte euch alle herzlich erstmal begrüßen. Ich programmiere Python leider weder besonders lange noch besonder häufig, wodurch ich hin und wieder mal auf einige Probleme stoße. Eines an dem ich gerade nicht weiter komme folgt:

Wir haben hier auf der Arbeit einen Postfix-Mail-Server. Die Domain für die er verantwortlich ist soll bald abgeschaltet werden. Deshalb soll anhand des Logs analysiert werden welcher Nutzer von welchem Absender noch wie viele Mails über diese Domain bekommt, um im Anschluss die Nutzer automatisch darüber in Kenntnis zu setzen. Keine Sorge, Datenschutzrechtlich ist mit dem Betriebsrat und dem Datenschutzbeauftragten alles geklärt und die Nutzer sind informiert, zudem soll die Auswertung ja nicht per Hand erfolgen.

Das Heraufiltern der Inforationen klappt auch schon. Die Struktur für diese Daten haben wir uns folgendermaßen vorgestellt:

Ein Dictionary mit der Zuordnung "Empfänger:Absender" wobei "Absender" wiederum ein Dictionary mit der Zuordnung "Absender:Anzahl" sein soll.
Nun muss ja für jeden Empfänger automatisch ein ein weiteres Dictionary "Absender:Anzahl" erstellt werden und an dieser Stelle klemmt es gerade ein bisschen.

Könntet mir vielleicht ein Beispiel für diese Struktur geben?

Ich hoffe es ist einigermaßen klar geworden, worauf ich hinaus will, ansonsten versuche ich gerne genauer zu werden.

Dann schon mal vielen Dank und viele Grüße,
Johnny
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Code: Alles auswählen

>>> data = {}
>>> data['Guenter'] = {'Peter': 3}
>>> data
{'Guenter': {'Peter': 3}}
>>>
?

Edit: oder sowas ...

Code: Alles auswählen

data = {}
for recipient, sender, count in postfix_log:
    data[recipient] = {sender: count}
johnny08
User
Beiträge: 3
Registriert: Mittwoch 29. Juni 2011, 16:22

Ok, danke. Hast mir schon mal geholfen.

Nun hab ich ein anderes Problem: Ich glaube der Counter stimmt nicht ganz. Wenn ich die Einträge der Absender im Log zählen lasse und mit dem Counter, den mir das Script ausspuckt vergleiche kommt er mir zu hoch vor.

Hier mal der entsprechenden Abschnitt, das geschieht für jeden Absender:

Code: Alles auswählen

                    
if recipient_sender.has_key(recipient):
    tempdict = recipient_sender[recipient]
    if tempdict.has_key(sender):
        counter = tempdict[sender]
        counter = counter + 1
    tempdict[sender] = counter
    recipient_sender[recipient] = tempdict
else:
    counter = 1
    recipient_sender[recipient] = {sender : counter}
BlackJack

@johnny08: Das kann gut sein dass die Zähler nicht stimmen, denn wenn es den Empfänger schon gibt, den Absender aber noch nicht, dann wird die Anzahl nicht auf 1 gesetzt, sondern auf den Wert, an den `counter` zufällig gerade gebunden ist.

Enthaltensein eines Schlüssels in einem Wörterbuch sollte man mit dem ``in``-Operator testen, und nicht mit der `has_key()`-Methode. Die ist ”deprecated” und wurde in Python 3.x dann auch abgeschafft.

Statt diese Prüfungen selbst durchzuführen, bietet sich hier `collections.defaultdict` als Datentyp an. Vorher am besten mal mit der ``lambda``-Anweisung auseinander setzen — anonyme Funktionen sind dafür sicher nützlich.
johnny08
User
Beiträge: 3
Registriert: Mittwoch 29. Juni 2011, 16:22

Hi, vielen Dank für den Tipp! Super! Ihr habt mir sehr geholfen!

Viele Grüße,
Johnny
Antworten