2016-11-10 4 views
0

Ich arbeite derzeit an einem Programm, das die Protokollfehlerdatei liest und die Datei aus dem Befehlszeilenargument nimmt, dann muss ich die meisten wiederholten 25 Fehler drucken.python3 for loop funktioniert nicht mit urlopen

Zum Beispiel; (dies ist eine wirklich große Datei so dass ich nur & Paste paar Zeilen kopieren wird dies deutlich machen)

[Sun Oct 09 14:15:52 2011] [error] [client 64.15.156.151] script '**/var/www/html/myip.php**' not found or unable to stat 

[Sun Oct 09 14:16:25 2011] [error] [client 64.15.156.151] script '**/var/www/html/myip.php**' not found or unable to stat 

[Sun Oct 09 14:18:42 2011] [error] [client 123.166.54.36] File does not exist: **/var/www/html/deny2** 

[Sun Oct 09 14:26:48 2011] [error] [client 66.249.68.178] File does not exist: **/home/ms10694/public_html/homepage/Midterm Project/zengarden-sample.html** 

[Sun Oct 09 14:29:59 2011] [error] [client 64.15.156.151] script '**/var/www/html/myip.php**' not found or unable to stat 

[Sun Oct 09 14:30:23 2011] [error] [client 38.99.97.53] File does not exist: /var/www/html/robots.txt** 

[Sun Oct 09 14:30:23 2011] [error] [client 38.99.97.53] File does not exist: **/var/www/html/favicon.ico** 

ich für Schleife jene bolded Adressen suchen in benötigen und die meisten sich wiederholenden 25 Fehler zu finden.

Mein Code sucht nach jeder Zeile enthält "/var.....+" aber aus irgendeinem Grund druckt es nur sehr zuerst "/var...+" auf Log-Fehler-Datei. Was fehlt mir hier?

#!/usr/bin/env python3 
import urllib.request 
import re 
import sys 
import os 

Argument = sys.argv[1] 

LogErrorFile = urllib.request.urlopen(Argument) 

InBytes = LogErrorFile.read() 

InString = InBytes.decode("utf8") 

#for s in InString: 
text = InString 
for s in InString: 
FindLines = re.findall('/var.+', text) 
print (FindLines[0]) 

Antwort

0

Es gibt viel los hier, damit ich Ihnen eine leicht vereinfachte Version geben würde, was Sie suchen:

import io 
import re 
from sys import argv 

in_file = argv[1] 

with io.open(in_file, 'r', encoding='utf-8') as my_file: 
    for line in my_file: 
    print(re.findall('\/var.*', line)) 

Warum es nicht hält den ersten/var Zeilendruck ?

Weil Sie bitten, es zu mit dem Null hier:

FindLines[0] 

Es ist nicht klar, wie Sie definieren „Fehler“ (ganze Zeile nur ein Stück?) So Ich ziehe nicht die häufigsten Fehler. Und diese Typ-Fehlerdatei wird normalerweise nicht remote abgerufen, also habe ich nicht eingeschlossen. Stattdessen nahm ich an, dass es lokal war und das io Modul verwendete.

Hoffe, dass hilft!

+0

Vielen Dank! Ich musste urllib verwenden, also ging ich diesen Weg; Ich schickte die Fehlermeldungen in dir, damit ich dort vergleichen konnte ich auch die for-Schleife auf dic funktioniert, wie es sein sollte. – denizburak54