Seite 1 von 1

Funktionsbezeichnung und Liste

Verfasst: Sonntag 11. Juli 2021, 10:30
von Brando
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()

Re: Funktionsbezeichnung und Liste

Verfasst: Sonntag 11. Juli 2021, 10:58
von __deets__
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.

Re: Funktionsbezeichnung und Liste

Verfasst: Sonntag 11. Juli 2021, 11:29
von nezzcarth
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.

Re: Funktionsbezeichnung und Liste

Verfasst: Sonntag 11. Juli 2021, 12:14
von Sirius3
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