2016-05-20 9 views
2

Neu auf der Website, so entschuldige ich mich, wenn ich dies falsch formatieren.Slice-Variable von angegebenen Buchstaben zu bestimmten Buchstaben in der Zeile, die in der Länge variiert

eine Datei Also für Linien Ich suche

Server[x] ip.ip.ip.ip response=235ms accepted....

enthält, wobei x eine beliebige Zahl größer oder gleich 0 sein kann, dann diese Informationen in einem line benannten Variablen zu speichern.

ich drucke dann diesen Inhalt einer tkinter GUI und seine Art und Weise zu viele Informationen für das Fenster.

dies zu beheben Ich dachte, ich die Informationen mit einem return line[15:30] in der Funktion nach unten schneiden würde, aber die Informationen, die ich diese Zeilen fallen wollen sie nicht immer zwischen 15 und 30

das ich zu machen versucht zu beheben zu eine Schleife mit

return line[cnt1:cnt2]

geprüft cnt1 und cnt2 in einer Schleife, bis cnt1 "S" erfüllt und cnt2 erfüllt "a" aus akzeptiert.

Das Problem ist, dass ich zu Python bin neu und ich kann die Schleife zu arbeiten.

def serverlist(count): 
    try: 
     with open("file.txt", "r") as f: 
      searchlines = f.readlines() 
     if 'f' in locals(): 
      for i, line in enumerate(reversed(searchlines)): 
       cnt = 90 
       if "Server["+str(count)+"]" in line: 
        if line[cnt] == "t": 
         cnt += 1 
        return line[29:cnt] 
    except WindowsError as fileerror: 
     print(fileerror) 

Ich habe auf der Linie Lesung eine reversed, weil die Linien I für Wiederholungen immer und immer wieder alle paar Minuten in der Textdatei suchen.

Ursprünglich wollte ich von unten scannen und zu stoppen, wenn es um server[0] bekam aber diese Schleife funktioniert auch nicht für mich.

Ich gab auf und begann nur serverlist(count) laufen und Angabe der Server-Nummer, die ich suchte, anstatt nur serverlist() ausgeführt.

Hoffentlich, wenn ich verstehe das Problem mit meiner ursprünglichen Schleife ich dieses Problem beheben kann.

Ende Ziel hier:

datei.txt hat mehrere Zeilen mit

<timestamp/date> Server[x] ip.ip.ip.ip response=<time> accepted <unneeded garbage>

Ich möchte aus dieser Linie nur die Server[x] und die Reaktionszeit schneiden und es zeigen woanders mit einer Variablen.

Die Zeile kann von Server[0] bis Server[999] reichen, und die gleichen Antwortzeiten werden alle paar Minuten überprüft, sodass ich doppelte Einträge vermeiden und nur die letzten Einträge am unteren Ende des Protokolls abrufen muss.

Im sorry das ist langwierig und verwirrend.


EDIT:

Hier ist, was ich denken halten sollte funktionieren, aber es funktioniert nicht:

def serverlist(): 
ips = [] 
cnt = 0 
with open("file.txt", "r") as f: 
    for line in reversed(f.readlines()): 
     while cnt >= 0: 
      if "Server["+str(cnt)+"]" in line: 
       ips.append(line.split()) # split on spaces 
       cnt += 1 
return ips 

Meine Testprotokolldatei hat Server [4] über den Server [0]. Ich würde denken, dass das oben von der Unterseite der Datei lesen würde, Druckserver [4] Linie, dann Server [3] Linie, usw. und stoppe, wenn es 0 trifft. Theoretisch würde es davon abhalten, jede Linie in der Akte zu lesen (läuft schneller) und es würde mir nur die neuesten Daten geben. ABER wenn ich das mit while cnt >=0 starte, bleibt es in einer Schleife hängen und läuft für immer. Wenn ich es mit einem anderen Wert wie 1 oder 2 ausführe, dann gibt es eine leere Liste []. Ich nehme an, ich verstehe nicht, wie das funktionieren würde.

Antwort

2

Hier ist mein erster Ansatz:

def serverlist(count): 
    with open("file.txt", "r") as f: 
     for line in f.readlines(): 
      if "Server[" + str(count) + "]" in line: 
       return line.split()[1] # split on spaces 
    return False 

print serverlist(30) 
# ip.ip.ip.ip 

print serverlist(";-)") 
# False 

Sie können den Index den spezifischen Raum in line.split()[1] ändern Zeichenfolge der Leitung getrennt zu erhalten.


bearbeiten: Sicher, einfach, wenn die Bedingung entfernen Sie alle IP-Adressen zu erhalten:

def serverlist(): 
    ips = [] 
    with open("file.txt", "r") as f: 
     for line in f.readlines(): 
      if line.strip().startswith("Server["): 
       ips.append(line.split()[1]) # split on spaces 
    return ips 
+0

Dies ist eine wunderbare Lösung auf der ganzen Linie nur die Daten für das Schneiden, die ich brauche. Ich konnte den Index auf 3: 6 ändern, um zu bekommen, was ich brauchte. Ist es möglich, die Schleife in die Funktion einzufügen, so dass sie mir alle Ergebnisse in einer Abfrage liefert? Wie es ist, gibt dies nur das Ergebnis für Server [30] zurück. – sidnical

+0

Das würde nicht nur die Zeilen mit dem "Server [x]" ziehen, so dass es alles in der Datei zurückgibt, was zu viel Info ist. Um zu verdeutlichen: Mit der ersten Lösung an Ort und Stelle kann ich Serverliste (0), dann Serverliste (1), dann Serverliste (2) usw., um die Werte, die ich will, aber das ist viel tippen, wenn ich 99 Server habe . Ich möchte nur serverlist() ausführen und es auf meine GUI die Informationen von jedem Server, aber nur ein einziges Mal und nur die Einträge von der Unterseite der Datei ausgeben, damit ich weiß, dass sie die neuesten Informationen sind. – sidnical

+0

Ich habe es wieder bearbeitet. Sind die Zahlen in der Datei eindeutig? –

Verwandte Themen