Python frage eines newbi

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.
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!

Wow ich bin das erste mal in diesem forum und es ist sehr infomativ. Ich hab schon ne Menge gelesen. Leider hab ich ein spezielles Problem bei dem ich nicht weiter komme. :cry:
Und zwar versuche ich mit phyton folgendes Problem zu lösen. ich will anhand einer serverlog datei ein Programm schreiben welches aus der datei anzeigt wieoft jemand auf eine Seite zugegriffen hat.
Leider hab ich Python erst seit einer woche und deshalb kenn ich mich noch nicht so gut aus ich hoffe jemand kann mir weiter helfen. :?:

Ich dokumentiere mein projekt auch damit es auch später als nachschlagewerk dienen kann.

http://vivaldi.wi.hs-wismar.de/twiki/bi ... ptfunktion
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Calanetics hat geschrieben:Leider hab ich Python erst seit einer woche und deshalb kenn ich mich noch nicht so gut aus ich hoffe jemand kann mir weiter helfen. :?:
Machen wir gerne. Konkrete Fragen musst Du aber schon stellen.

Was wirst Du grob brauchen?
- Datei zeilenweise einlesen (falls die Seitenzugriffe jeweils in einer Zeile protokolliert sind; hängt von der Serversoftware ab)
- Besucher-IP und Seitenadresse aus jeder Zeile extrahieren (wie, ist natürlich vom Format der Zeile abhängig)
- sich merken, das wievielte Male die Kombination Besucher-IP/Seitenadresse vorgekommen ist (Tipp: Datentyp Dictionary)
- Statistik erstellen

Zu den Themen Datei lesen und Dictionary findest Du auch was im Tutorium, das Teil der Dokumentation ist.

Jan
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo da bin ich wieder (hab leider nen bißchen gekränkelt)
und hab eigentlich viel gelesen und meine 1. gehversuche mit python versucht und oft verdammt viele Fehlermeldungen bekommen:)

Zuerst einmal hab ich mal einen Auszug aus einer serverlog mitgebravht damit ihr euch das auch besser vorstellen könnt.

| 01 Oct 2003 - 10:16 | Main.TWikiGuest | view | LVIT.PaB | | 193.175.240.204 |
| 01 Oct 2003 - 10:16 | Main.TWikiGuest | view | LVIT.PaBplan | | 193.175.240.204 |
| 01 Oct 2003 - 10:17 | Main.FrankMoritz | save | LVIT.PaBteam | | 193.175.240.236 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaBteam | | 193.175.240.236 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaC | | 193.175.240.204 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaCplan | | 193.175.240.204 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaE | | 193.175.240.204 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaEPlan | | 193.175.240.204 |
| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.WebHome | | 217.229.237.234 |
| 01 Oct 2003 - 10:18 | Main.TWikiGuest | view | LVIT.PaF | | 193.175.240.204 |
| 01 Oct 2003 - 10:18 | Main.TWikiGuest | view | LVIT.PaFplan | | 193.175.240.204


Mein gedanke war es jetzt die Datei einzulesen nach der Kombination view und der entsprechenden seite abzusuchen.Ich hab vieles probiert aber denke der Anstz womit ich auf dem richtigen weg sein könnte wäre dieser.

#!/usr/bin/env python
import string

f = open ("C:/windows/temp/test.txt", 'r')

for line in f.readlines():
if line[??????] == 'view':
print line,

Zu Testzwecken hab ich die datei erstmal auf meinem rechner lokal gespeichert um erstmal den Grundalgorythmus hunzubekommen. doch leider nicht so wie ich will. Und zwar dort wo die Frage zeichen sind bin ich noch nicht drauf gekommen wie ich es schaffen könnte das er in einer ganzen Zeile die word kombination sucht(müßte ja ne und verknüpfung sein).hatte es nur bisher hinbekommen das mein prgramm die zeielen ausgibt weches das word view beinhaltet.Gibt es nicht auch irgendwie nen befehl wie line.count um die zeieln zu zählen dann?
Ein Tipp von euch waren auch noch Dictionaries. Hab ne Menge dazu gelesen aber wie könne die mir helfen? Ich würde sagen in meinem Fall machen die mich doch eher unflexibel oder?
Zuguter letzt war mein gedanke die entsprechende seite einzugeben vom nutzer welches dann von python an eine variable übergeben wird. Leider geht das wohl auch nciht so einfach wie mit dem befehl den ich wohl selber created hab->a = string(raw_input())
Vielleicht Bau ich aber auch schon alles auf einen Denkfehler auf. Fals ja korriegiert mich einfach:)
Bitte, Bitte habt auch Geduld mit mir ich versuche mich von mal zu mal zu steigern.
Vielen Dank und schönen Abend noch. Ich weiß war ne Menge für so nen kleinen Code.
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

nehmen wir an, du hast eine der zeilen in der variable line als string.
als erstes solltest du die einzelnen felder, die durch das "|" abgegrenzt sind, aufspalten.
line.split("|")
als ergebnis hast du dann eine liste, das in etwa so aussieht:

Code: Alles auswählen

['', ' 01 Oct 2003 - 10:16 ', ' Main.TWikiGuest ', ' view ', ' LVIT.PaB ', ' ', ' 193.175.240.204 ', ' ']
jetzt kannst du im 3. feld das view oder save ueberpruefen, z.b. so:

Code: Alles auswählen

linearray = line.split("|")
if linearray[3] == " view ": # alternativ auch: if linearray[3].strip() == "view"
     print line
hoffe, das hilft dir ein wenig weiter.

auf bald
oenone
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Ein Tipp von euch waren auch noch Dictionaries. Hab ne Menge dazu gelesen aber wie könne die mir helfen? Ich würde sagen in meinem Fall machen die mich doch eher unflexibel oder?
Zuguter letzt war mein gedanke die entsprechende seite einzugeben vom nutzer welches dann von python an eine variable übergeben wird.
Kannst Du nochmal genau beschreiben, was das Programm tun soll. Benutzereingaben hattest Du ursprünglich nicht erwähnt. Das Programm soll also interaktiv bedienbar sein? Soll man wahlweise den Benutzer oder die Seite angeben können? Als Resultat bekäme man dann zu einem User die Infos, wie häufig er auf welcher Seite war oder zu einer Seite, wie häufig welcher User auf ihr war. Oder ist (nur) eine Gesamtstatistik gefragt?
Beispiel:
User A war 6-mal auf Seite S.
User A war 2-mal auf Seite U.
User B war 1-mal auf Seite U.

etc.
Ich hab' gesehen, dass Ihr ja mit dem Begriff Pflichtenheft was anfangen könnt. In dem Stil (aber natürlich nicht so ausführlich) müsstest Du mal erläutern, was am Ende rauskommen soll, mit möglichst wenig Interpretationsspielraum.

BTW: Ein paar mehr Großbuchstaben mehr im Text erleichterten gerade bei soviel Text doch deutlich die Lesbarkeit :wink:

Jan - der sich erstmal zum Grünkohlessen verabschiedet
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Danke, Danke für eure Tipps so konnt ich heut schon nen bißchen weiterarbeiten.

Hallo Voges!
Ich seh du hast schon ein bißchen gelesen auf unserer Projektseite.
Letzendlich soll herauskommen(fals ich ich meine Ziele während des Projektes nicht noch nach oben hin korrigieren sollte:) )
100% kann ich dir das aber erst Dienstag sagen, da ich mich nochmal absprechen muss.

1. Eine interaktive Anwendung von einem beliebigen Arbeitsplatz mit
Administratorrechten.(Datei liegt aufm Server was bestimmt auch noch
eine kleine Programierleistung bedarf.)
2. Das man über einen Button die Statistik aufruft.(Weiß aber auch
noch nicht ob das so mit python geht oder man es z.B. mit Java
koppeln muss.)
3.Die Statiskik soll nur alle TWIKI Seiten enthalten und wie oft auf sie
zugegriffen wurde, und ob intern oder extern zugegriffen wurde.

Aber ich werd mich nochmal absprechen ob es so reicht.
Spielt es eigentlich eine Rollen unter welechem Betriebssystem es laufen soll?
Ich selbst hab heut mal wieder ein bißchen probiert und dies ist dabei herausgekommen:



#!/usr/bin/env python
import string

ausgab = open ("C:/windows/temp/tester.py", 'w')
f =open ("C:/windows/temp/test.txt", 'r')
for line in f.readlines():
linearray = line.split("|")
if linearray[3] == " view " and linearray[4] == " LVIT.PaB ": # alternativ auch: if linearray[3].strip() == "view"
ausgab.writelines(linearray)

C = open ("C:/windows/temp/tester.py", 'r')

L = C.readlines()

print len(L)

Das Programm zeigt jetzt an wie oft auf eine Seite zugegriffen wurde.
Probleme sind:
- Die Seite nach der gesucht werden soll muss ich immer noch im Quelltext eintragen. würde die aber über eine Eingabe übergeben
- außerdem speicher ich die gefilterten Zeilen erst nochmal zwichen in der Dater tester.py um dann die Zeilen zu zählen.Geht das nicht auch einfacher?
- noch ein Problem ist, das alle Seiten akzeptiert werden die z.B. hier LVIT.PaB enhalten.Also auch LVIT.PaBhome (was nicht gewollt ist)
Kann ich das verhindern?

Oh mensch war wieder ne Menge aber ich wünsch euch noch nen schönes WE.
Bis danni
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Ich selbst hab heut mal wieder ein bißchen probiert und dies ist dabei herausgekommen:
Setze bitte Quellcode in zwischen die [ code ][ /code ]-Tags. Dann bleiben die Einrückungen erhalten.
Calanetics hat geschrieben:Probleme sind:
- Die Seite nach der gesucht werden soll muss ich immer noch im Quelltext eintragen. würde die aber über eine Eingabe übergeben
- außerdem speicher ich die gefilterten Zeilen erst nochmal zwichen in der Dater tester.py um dann die Zeilen zu zählen.Geht das nicht auch einfacher?
- noch ein Problem ist, das alle Seiten akzeptiert werden die z.B. hier LVIT.PaB enhalten.Also auch LVIT.PaBhome (was nicht gewollt ist)
Kann ich das verhindern?
- zum ersten Punkt: Über eine Benutzereingabe aber wohl eher nicht, oder? Das wäre doch sehr mühselig immer korrekt den richtigen String einzugeben. Dem Script könntest Du den Seitennamen als Parameter übergeben. Der Aufruf lautet dann (unter Windows): python.exe dasScript.py LVIT.PaB . "LVIT.PaB" steht dann in der Variablen sys.argv[1] zur Verfügung (siehe Code unten).
- zum zweiten Punkt: Warum zählst Du nicht gleich im if-Block einen Zaehler hoch (siehe Code)?
- zum dritten Punkt: Kann eigentlich nicht sein. Du prüft ja auf Gleichheit und nicht, ob der eine String im anderen enthalten ist. Die Leerzeichen vor und hinter dem Trenner '|' sind wirklich ärgerlich. Ich vermute mal, dass sie keine Bedeutung haben, sondern nur "Zierde" sind und ignoriert werden können.
Hier der angepasste Code:

Code: Alles auswählen

#!/usr/bin/env python
import sys

if len(sys.argv) != 2: sys.exit(0)

f =open ("test.txt", 'r')
zaehler = 0
for line in f.readlines():
    linearray = line.split("|")
    if linearray[3] == " view " and linearray[4].strip() == sys.argv[1]:
        zaehler += 1
f.close()
print zaehler
Naja, was die Gesamtapplikation betrifft, klärst Du ja sicherlich noch einiges. Mir ist nicht klar, ob das jetzt eine Webanwendung werden soll (ins Wiki integriert oder auch nicht) oder eine StandAlone-Anwendung (GUI oder Konsole), die irgendwie auf die Daten zugreift.

Jan - pappsatt
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!
Wie gehts meinem besten mann Voges?:)
Also ich habe das Projekt jetzt nochmal genau abgesteckt.
Ziel ist es jetzt über eine HTML Seite die gewünschte Seite in ein edit Feld einzutragen wobei dann der Name an das Python Programm übergeben wird.Und das Ergebnis wie oft auf diese Seite geklickt wurde und ob intern oder extern auf Sie zugegriffen wurde soll wieder auf einer HTML Seite dann ausgegeben werden. Das Python Programm wird auf einem Zope Server liegen.
Das Zweite ist das das man in einem edit feld einen Monat eingibt (oder auch schon 12 buttons vorhanden sind mit den Monatsnamen) und eine Komplette Statistik ausgegeben werden soll über alle seiten in der server log und wie oft auf diese Geklickt wurde.

So Für das zweite Problem hab ich mir gedacht das ich wieder die log in felder aufteile und wieder schau welche Seiten es dort gibt und schreibe sie dann in eine Liste.

Code: Alles auswählen

#!/usr/bin/env python 
import string 



f =open ("C:/windows/temp/test.txt", 'r')# einlesen der log Datei        
L =[]
for line in f.readlines():  
    linearray = line.split("|")
    if linearray[3] == " view " : 
        L = [L, linearray[4]]

print L
f.close() 
Kann man das so in etwa machen? Also die Seiten hat er alle richtig in eine Liste geschrieben doch sieht sie ein bißchen komisch aus oder (viele klammern)

[[[[[[[[[[[], ' LVIT.PaB '], ' LVIT.PaB '], ' LVIT.PaBplan '], ' LVIT.PaBteam '], ' LVIT.PaC '], ' LVIT.PaCplan '], ' LVIT.PaE '], ' LVIT.PaEPlan '], ' LVIT.WebHome '], ' LVIT.PaF '], ' LVIT.PaFplan ']

Ein weiteres Problem ist das einige Seite jetzt doppelt sind. Kennt jemand einen Ansatz für mich wie ich die auschließen kann?
Ist meine Idee überhaupt richtig es so zu machen um dann für jede Seite aus der Liste die Klicks dann wieder zu zählen?Oder gibt es eine bessere Lösung?


Nun nochmal zu meinem letzten Quelltext.

Code: Alles auswählen

#!/usr/bin/env python 
import sys 

if len(sys.argv) != 2: sys.exit(0) 

f =open ("test.txt", 'r') 
zaehler = 0 
for line in f.readlines(): 
    linearray = line.split("|") 
    if linearray[3] == " view " and linearray[4].strip() == sys.argv[1]: 
        zaehler += 1 
f.close() 
print zaehler 
Kann mir jemand erklären wozu strip() nötig ist?
Ansonsten läuft es ganz gut unter windows.
Leider kommt der Quelltext aber unter unix nicht ganz hin da die felder nicht mehr stimmen. Grund dafür ist das bei der log.txt nicht das Zeilenende erkannt wird glaub ich.da die log unter unix so aussieht:


| 01 Oct 2003 - 10:16 | Main.TWikiGuest | view | LVIT.PaB | | 193.175.240.204 |*| 01 Oct 2003 - 10:16 | Main.TWikiGuest | view | LVIT.PaBplan | | 193.175.240.204 |*| 01 Oct 2003 - 10:17 | Main.FrankMoritz | save | LVIT.PaBteam | | 193.175.240.236 |*| 01 Oct 2003 - 10:17 | Main.TWikiGuest | view | LVIT.PaBteam | | 193.175.240.236 |

stat dem stern ist es aber ein Schwarzes Rechteck der die zeilen nur trennt statt das sie wie in windwos alle untereinander stehen.
Weiß jemand wie ich das Problem lösen kann?

Meine letzte Frage zu ist: Da ich ja den Text erweitern will um die Anzeige ob die Ip extern ist oder intern kann ich wieder vergeleichen.
mit folgenden nummer die intern sind
193.175.240.*
172.30.30.*
192.168.*.*

Mein Problem beim String vergleich ist jetzt aber das ich nicht die kompletten nummern hab sondern nur den anfang da der rest ja immer anders sein kann.gibt es denn auch in python platzhalter um einen stringvergleich machen zu können?

Oh bitte erschießt mich nicht ich weiß ist ne <menge aber ich weiß noch so wenig aber ich versuche mich zu bessern doch glaub es dauert noch ne weile bis ich mal nen halber profi bin:)
schönen abend an alle

Ps:meine versuche den Quelltext einzurücken sind wieder gescheitert was mach ich nur falsch
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Calanetics,

bei [code]..[/code] dürfen nach dem code keine Leerzeichen sein und BBCode darf auch nicht deaktiviert sein, unten bei den Optionen beim Postingformular.


Gruß

Dookie
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Calanetics: [[[[[[[[[[[], ' LVIT.PaB '], ' LVIT.PaB '], ' LVIT.PaBplan '], ' LVIT.PaBteam '], ' LVIT.PaC '], ' LVIT.PaCplan '], ' LVIT.PaE '], ' LVIT.PaEPlan '], ' LVIT.WebHome '], ' LVIT.PaF '], ' LVIT.PaFplan ']
Das ist nicht eine Liste, sondern das sind mehrere ineinander verschachtelte Listen. Zum ergänzen einer Liste gibt es die Listen-Methode append(). Mit + kannst Du allerdings auch zwei Listen verbinden.

Calanetics: Ein weiteres Problem ist das einige Seite jetzt doppelt sind. Kennt jemand einen Ansatz für mich wie ich die auschließen kann?
Packe die Seitennamen als Key in ein Dictionary. Mit der Dictionary-Methode keys() kannst Du Dir dann die 'bereinigte' Liste der Seitennamen zurückgeben lassen.

Calanetics: Ist meine Idee überhaupt richtig es so zu machen um dann für jede Seite aus der Liste die Klicks dann wieder zu zählen?Oder gibt es eine bessere Lösung?
Mit einem Dictionary könnte man das in einem Durchgang erledigen (Key: Seitenname, Value: Zaehler). Aber mach' es lieber auf eine Weise, die Du Dir selbst erarbeitet hast. Dein Ansatz ist nicht so viel schlechter.

Calanetics: Kann mir jemand erklären wozu strip() nötig ist?
Lass das .strip() mal weg. Funktioniert es dann noch? Was strip() konkret macht, steht in der Doku.

Calanetics: stat dem stern ist es aber ein Schwarzes Rechteck der die zeilen nur trennt statt das sie wie in windwos alle untereinander stehen.
Ich kenne das Problem genau umgekehrt, dass nämlich einige Windowseditoren (z.B. notepad) Unix-Zeilenumbrüche ("\n") als schwarze Blöcke darstellen, weil sie zwingend Windows-Zeilenumbrüche ("\r\n") haben wollen. Python müsste das aber eigentlich ziemlich egal sein! Die log-Datei kommt aber doch ursprünglich von einem Unix-Rechner, oder? Und schon dort wird sie in einem Editor nicht richtig angezeigt? Ansonsten versuche mal rauszubekommen, welchen ASCII/ISO-Code das Zeichen hat. Entweder mit einem Hex-Editor oder einem Python-Script und der buildin-Funktion ord() (so als kleine Nebenübung ;-) ).

Calanetics: gibt es denn auch in python platzhalter um einen stringvergleich machen zu können?
(Grummel, Kleinschreiber!) Ja, brauchst Du aber hier nicht. Mit string.startswith() kannst Du feststellen, ob ein String mit einer bestimmten Zeichkette beginnt.

Jan
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Ui, ich hab mich gerade erst durchgekämpft, aber du bist ja dank Voges schon verarztet :wink: . Ich hab deinen Beitrag auch gleich mal editiert, weil ich das nicht lesen konnte :roll:. Der Rest vom BBcode mit seinen Formatierungsmöglichkeiten steht (falls du ihn mal wieder brauchen solltest) hier.
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!
Voges ich glaub ich hab jetzt den Sin von Dictionarys erkannt und muss sagen es es doch angenehmer mit ihnen zu arbeiten als mit append() in eine Liste einzufügen. So hab ich meinen Quellcode erweitert:

Code: Alles auswählen

#!/usr/bin/env python 
import string 



f =open ("C:/windows/temp/test.txt", 'r')# einlesen der log Datei        
d ={}
for line in f.readlines():  
    linearray = line.split("|")
    if linearray[3] == " view " : 
        d[linearray[4]] = zaehler
for s in d.keys():
    zaehler = 0        
    for line in f.readlines():  
        linearray = line.split("|")
        if linearray[3] == " view " and linearray[4] == s: 
            zaehler += 1 
            d[s] = zaehler
print d
f.close()
und:

Code: Alles auswählen

#!/usr/bin/env python 
import string 



f =open ("C:/windows/temp/test.txt", 'r')# einlesen der log Datei        
d ={}
for line in f.readlines():  
    linearray = line.split("|")
    if linearray[3] == " view " : 
        d[linearray[4]] = 0


for s in d.keys():
    zaehler = 0     
    for line in f.readlines():  
        linearray = line.split("|")
        if linearray[3] == " view " and linearray[4] == s: 
            zaehler += 1 
    print s, zaehler


f.close()
wie du siehst ist wohl der einzige Unterschied das ich einmal den Zähler unter den values abspeichere und bei der anderern Version den Zähler gleich ausgeben möcht.

Mein Problem ist das folgendes ausgegeben wird.

Beim 1. Programm:

Code: Alles auswählen

{' LVIT.PaEPlan ': 0, ' LVIT.PaFplan ': 0, ' LVIT.PaF ': 0, ' LVIT.PaBplan ': 0, ' LVIT.PaB ': 0, ' LVIT.PaE ': 0, ' LVIT.WebHome ': 0, ' LVIT.PaCplan ': 0, ' LVIT.PaBteam ': 0, ' LVIT.PaC ': 0}
und beim 2.

Code: Alles auswählen

LVIT.PaEPlan  0
 LVIT.PaFplan  0
 LVIT.PaF  0
 LVIT.PaBplan  0
 LVIT.PaB  0
 LVIT.PaE  0
 LVIT.WebHome  0
 LVIT.PaCplan  0
 LVIT.PaBteam  0
 LVIT.PaC  0
bei beiden stimmen die ergebnisse nicht!!
Ich hab schon hin und her überlegt aber für mich ist der Code richtig.
Die einzige Vermutung die ich hab ist das jetzt das Problem zum tragen kommt das jedes Feld mit einem Leerzeichen ankommt.
Oder sind meine Überlegungen falsch und es ist einfach nur wieder Samstag abend?

Ich versuche auch schon mit der der string.startswith() Methode zu arbeiten. Aber irgendwie kommt immer die meldung:AttributeError: 'module' object has no attribute 'startwith'
Gibt es diese Methode bei Python2.2 noch nicht?
Ich hab schon im Internet gesucht aber es ist leider nicht viel zu finden und mein Buch gibt wieder mal garnichts her.

Voges an meiner kleinen Nebenübung arbeit ich noch:)
Also ausprobiert hatte ich es unter der Cetrix Oberfläche in Unix und dort bei dem Texteditio wurden die Zeilenumbrüche nicht erkannt.
Aber ich versuchs Montag auch nochmal richtig unter Unix vielleicht tritt dort das Problem ja nicht mehr auf.

Juhu ich habs mit dem Code einrücken geschafft:)
Wünsch euch allen noch einen schönen abend.
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:ich glaub ich hab jetzt den Sin von Dictionarys erkannt
Zumindest im Ansatz. Du könntest schon in der 1. for-Schleife zählen. Aber das muss erstmal nicht sein.
Calanetics hat geschrieben:bei beiden stimmen die ergebnisse nicht!!
Ich hab schon hin und her überlegt aber für mich ist der Code richtig.
In beiden Scripten ist tatsächlich nur ein kleiner Fehler (abgesehen von dem d[linearray[4]] = zaehler im 1. Skript). Nach dem 1. readlines() steht der "Lesezeiger" ab Ende der Datei und vor jedem weiteren readlines() musst Du erstmal wieder an den Dateianfang zurückspringen, am einfachsten mit einem f.seek(0) dort wo Du auch den Zähler zurücksetzt.
Calanetics hat geschrieben:AttributeError: 'module' object has no attribute 'startwith'
Nur ein Typo? Da fehlt ein 's'. Ich werde ja schon grantig, wenn jemand sich beim Schreiben keine Mühe gibt und mir das Lesen erschwert, aber ein Interpreter/Compiler stellt mich da noch locker in den Schatten ;-)

Nachtrag: Milans(?) Hinweis (den er wohl wieder gelöscht hat), dass es string.startswith() gar nicht gibt, ist natürlich richtig. Da hab' ich Dich unbeabsichtigt in die Irre geführt. startswith() gibt es also 'nur' als Methode eines Strings.
Noch ein Tipp: Wenn Du Dir unter Windows die aktuelle Python-Version 2.3.2 installierst, hast Du auch gleich die Doku in diesem Windows-spezifischen Hilfeformat mit z.B. integrierter Suche. Sehr praktisch!


Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

noch ein Tipp ;)
vergiss das modul string, nimm gleich die methoden.


Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Voges hat geschrieben:Nachtrag: Milans(?) Hinweis (den er wohl wieder gelöscht hat), dass es string.startswith() gar nicht gibt, ist natürlich richtig. Da hab' ich Dich unbeabsichtigt in die Irre geführt. startswith() gibt es also 'nur' als Methode eines Strings.
Ja, hab ich :oops: . War mir einfach zu peinlich, dass ich wieder mal nen Buchstaben übersehen habe, nämlich wie von dir erklärt startswith.
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hi. Da bin ich wieder.
(Mußte noch Zope installieren)
Danke Voges für deine Hilfe. Das Programm läuft jetzt ohne Probs durch.
Also kann man sagen das der Grundalgorhytmus steht.

Allerdings soll es ja eine Web Applikation werden.
Ich hab erstmal eine ganz einfache HTML Seite Programmiert wo man in einem edit fenster den Monat oder die gewünschte Seite eingeben kann.
Also das was ich bisher über die Kommandozeile eingegeben hab.
Seh ich das richtig das ich mit jetzt Gedanken machen muss wie die Eingabedaten an Python ,mittels CGI Skript übergeben werden?
Ist es auch so einfach möglich auf die orginal log Dateien zuzugreifen die ja auf dem Serverliegen mittels Pfadangabe?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Calanetics hat geschrieben:Seh ich das richtig das ich mit jetzt Gedanken machen muss wie die Eingabedaten an Python ,mittels CGI Skript übergeben werden?
Ist es auch so einfach möglich auf die orginal log Dateien zuzugreifen die ja auf dem Serverliegen mittels Pfadangabe?
Dein Python-Script liegt ja ebenfalls auf dem Server. Wenn also der Webserver für das Ausführen von Python-Scripten konfiguriert ist und Du entsprechende Rechte hast, sollte das kein Problem sein.

Zum Thema CGI mit Python gibt es in der Library Reference unter 11.2 cgi -- Common Gateway Interface support einiges an Informationen.

Wenn wir weiterhin im diesem Thread bleiben, ist das ok. Aber ansonsten ist CGI im Netzwerkforum weiter unten on-topic.

Jan
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo!
Ja da bin ich wieder hier. Hab mich entschieden weiter unter diesem Thread zu schreiben damit vieleicht auch andere das Projekt besser nachvollziehen können.
Ich hab jetzt ziemlich viel über CGI gelesen und auch nen bißchen schon probiert.
Ich hab aber jetzt einen neuen Denkansatz bekommen. Und zwar muss ich überhaupt CGI verwenden? Gibt es nicht einfachere Methoden in Bezug auf Zope Aplikation Server, HTML und meinem Python Quelltext?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Calanetics,

Du kannst in Zope auch ein externes Script einbinden, dies ist auf http://www.dzug.org/ZopeBuch/ZWiki/ZBScriptingZope weiter unten beschrieben.


Gruß

Dookie
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Hallo.
Da bin ich wieder nachdem ich mal ne Woche hin und her probiert hab mit Zope.
Leider hab ich schon wieder nen Problem:(
Ihr kennt bestimmt noch mein Programm das alle Seiten aus der Log Datei und die Zugriffe zählt.
Ich hab jetzt die log txt hochgeleladen auf zope und nur zum testen mal folgendes Zope skript geschrieben.

Code: Alles auswählen

<dtml-var standard_html_header>
<center><h2><br>Diese Seite ermittelt für Sie irgent etwas Monats abhängiges.</h2>
<h1><br></h1> <h3>
<form action="aktionsSkript">
           Bitte Monat eingeben. <input type="text" name="name"><br><br></h3>
        <input type="submit">
        <input type=reset value="Eingabe löschen"> 
        <input type=button value="Zur&ck" onClick="history.back()">
</center>
      </form>
        
<dtml-var standard_html_footer>
und das flogende python skript

Code: Alles auswählen

# Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE =  request.RESPONSE

d1 = {'September' : 'test.txt', 
      'Oktober' : 'test1.txt'}
f =open (d1[name], 'r')       
d ={} 
for line in f.readlines(): 
    linearray = line.split("|") 
    if linearray[3] == " view " : 
        d[linearray[4]] = 0 

for s in d.keys(): 
    zaehler = 0 
    z1 = 0 
    z2 = 0 
    f.seek(0) 
    for line in f.readlines():   
        linearray = line.split("|") 
        if linearray[3] == " view " and linearray[4] == s: 
                                                         
            zaehler += 1 
            if linearray[6].startswith(' 193.175.240') or linearray[6].startswith(' 172.30.30') or linearray[6].startswith(' 192.168'): 
                z1 += 1 
            else: 
                z2 +=1 

    print "Auf die Seite" ,s, "wurde", zaehler, "mal zugegriffen. " "Intern:",z1, " Extern:",z2
                


return printed

mein problem ist zum einen es läuft mal wieder nicht.
jedes mal kommt jetzt der Fehler open ist not definied.
hat jemand ne Idee ? wo hier der Fehler ist?
Und Dookie DTML war nen super Tipp.
Ok Vielen Dank bis danni
Antworten