Funktionsbezeichnung und Liste

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
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Im folgenden Code wird eine Funktionsbezeichnung als Liste gedacht. Ist das möglich? Es werden also aus txt eingelesen, und dann in Dictionaries Werte gebildet.

Code: Alles auswählen

import re
def logs():
    i = 0
    logs() = []
    with open("assets/logdata.txt", "r") as file:
        # log_data = file.read()
        # in_line = file.readline()
        # print (in_line)
        for line in file:
            host, rest = line.split(" - ")
            user_name = re.findall(r"^[a-z]*[0-9]{4,4}", rest)
            user_name = "".join(user_name)
            time = re.findall(r"\[(.*)\]", rest)
            time = "".join(time)               
            request = re.findall(r'(\".*\s.*\")', rest)
            request = "".join(request)
            request = request[1:-1]
            #print (request)
            #print(host)
            #print (user_name)
        # one_item = {'host': host, 'user_name': user_name, 'time': time, 'request': request}
            if i == 0:
                one_item = {'host': host, "user_name": user_name, 'time': time, 'request': request}
                logs().append(one_item)
            else: 
                wert = i + "_item"
                wert = {'host': host, "user_name": user_name, 'time': time, 'request': request}
                logs().append(wert)
            i = i + 1
        # print (one_item)
        return logs()
        
    
        
    raise NotImplementedError()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe nicht, was du damit meinst.

Was nicht geht sind sehr viele Dinge in deinem code, zB

logs() = ....

funktioniert nie, weil man einem Funktionsaufruf nichts zuweisen kann. Was sollte dabei dann auch rumkommen?

Und du hast auch eine Endlosrekursion, weil du wieder logs() aufrufst, ohne Bedingung.

Angesichts deines letzten Posts hier sieht auch der ganze Parser-Code so aus, als ob du da unnoetig aus Daten, die eigentlich als JSON vorliegen, selbst parst. Auch das sollte vernuenftig passieren.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Es gibt Sprachen (z.B. Pascal), in denen man aus einer Funktion etwas zurück gibt, indem man es dem Funktionsnamen (nicht einem Funktionsaufruf) zuweist. Aber Python ist keine solche Sprache; da gibt es 'return'. Du kannst deine Datenstruktur, die du zurückgeben möchtest, also (gemäß den Konventionen) frei benennen und sie dann mit 'return' zurückgeben.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeig doch mal ein Beispiel, wie diese logdata.txt aussieht.
Und warum benutzt Du nicht einfach eine normale Variable?
Du suchst mit re.findall nach allen Strings, die am Anfang von `rest` stehen. Wie viele davon glaubst Du, gibt es? Aber die Diskussion ging ja schon in Deinem anderen Thread in diese Richtung.
Ich rate mal, wie die Zeile aussehen könnte, aber ohne die logdata.txt zu kennen, ist das natürlich nur eine Vermutung.
Es gibt keinen Unterschied zwischen dem Wörterbuch in `one_item` und `werte`, die beiden if-Blöcke machen das selbe, kann man also vereinfachen.

Code: Alles auswählen

def read_logs():
    logs = []
    with open("assets/logdata.txt", encoding="utf8") as lines:
        for line in lines:
            match = re.match(r'^(.*?) - ([a-z]*[0-9]{4})\s*\[(.*)\]\s*"(.*)"', rest)
            host, user_name, time, request = match.groups()
            one_item = {'host': host, "user_name": user_name, 'time': time, 'request': request}
            logs.append(one_item)
    return logs
Antworten