2016-10-03 3 views
-3

So schreibe ich dieses Python-Programm, das die Umlaufzeit aus einer Textdatei, die ich zahlreiche Pings enthält, was in der Textdatei unten vorher extrahieren müssen:Parsing-Float-Zahl von ping-Ausgabe in Textdatei

64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=12.6ms 
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=1864ms 
64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=107.8ms 

Was ich aus der Textdatei extrahieren möchte, sind die 12.6, 1864 und die 107.8. Ich benutzte regex, dies zu tun und haben die folgenden:

import re 
    ping = open("pingoutput.txt") 
    rawping = ping.read() 
    roundtriptimes = re.findall(r'times=(\d+.\d+)', rawping) 
    roundtriptimes.sort() 
    print (roundtriptimes) 

Das Problem, das ich habe ist, dass ich die Zahlen glauben, so in die roundtriptimes Liste als Strings gelesen werden, wenn ich gehe, sie sortieren sie nicht ordnen wie ich es gerne hätte.

Irgendeine Idee, wie man meinen regex findall Befehl ändert, um sicherzustellen, dass sie sie als Zahlen erkennt, würde ungeheuer helfen! Vielen Dank!

+0

Cross-Gepostet: http://unix.stackexchange.com/questions/314093/parsing-text-file-in-python/314095#314095http://unix.stackexchange.com/questions/314093/ parsing-text-file-in-python/314095 # 314095 Ich antworte dir schon, auch mit ** voll funktionierendem ** Python-Code ... –

+0

@GillesQuenot Ich habe das erst nach dem Posten einer Antwort gesehen. Das ist sehr bedauerlich. Es gibt tatsächlich eine voll funktionsfähige Python-Lösung in Ihrer Antwort (und eigentlich eine Regex, die besser ist als meine). – idjaw

Antwort

1

ich nicht von einer Art und Weise kennen zu tun, dass in RegEx, aber wenn Sie die folgende Zeile vor der Art hinzufügen, sollte es darum kümmert für Sie:

roundtriptimes[:] = [float(x) for x in roundtriptimes] 
1

Non-regex:

Einfach Spagat auf Platz, greifen Sie den letzten Eintrag, dann teilen Sie auf =, greifen Sie den zweiten Teil der Liste und verzichten Sie auf die letzten beiden Komponenten (ms). In einen Float werfen.

All das wird in einer Liste Verständnis getan:

Beachten Sie, dass readlines eine Liste zu haben, verwendet wird, um jede Zeile der Datei enthält, die viel einfacher zu verwalten.

with open('ping_results.txt') as f: 
    data = f.readlines() 

times = [float(line.split()[-1].split('=')[1][:-2]) for line in data] 
print(times) # [12.6, 1864.0, 107.8] 

regex:

Das Wichtigste hier ist die Aufmerksamkeit auf die regex zu zahlen verwendet werden:

time=(\d*\.?\d+) 

Suchen Sie nach time=, dann starten Sie eine Capture-Gruppe (), und greifen Ziffern (\d*), optional dezimal (\.?), Ziffern (\d+).

import re 

with open('ping_results.txt') as f: 
    data = f.readlines() 

times = [float(re.findall('time=(\d*\.?\d+)', line)[0]) for line in data] 
print(times) # [12.6, 1864.0, 107.8] 
+0

das gibt mir einen IndexError: Listenindex außerhalb des Bereichs –

+0

@SZapata Ich habe ein kleines Update für meine Regex gemacht (Allerdings funktionierte es immer noch mit der älteren Regex). Verwenden Sie jedoch Ihre Beispieldaten in einer Datei und kopieren Sie meinen Code. Alles funktioniert gut für mich. – idjaw