Python mit Gnuplot

Du hast eine Idee für ein Projekt?
Antworten
Tiguana
User
Beiträge: 4
Registriert: Dienstag 2. Dezember 2014, 11:13

Hallo erstmal,
ich bin neu in der Python-Welt und deshalb noch ziemlich unerfahren. Ich habe zwar mal mit C bzw. Java programmiert, aber Scripting ist mir völlig neu, deswegen seid bitte nicht zu sehr geschockt, wie wenig ich weiß. Auch mit gnuplot habe ich wenig Erfahrung, es wurde mir jedoch empfohlen und es sah mir ganz vernünftig aus, da es meines Wissens nach auch gut mit Python harmoniert.
Nun zu meinem Problem:
Ich möchte Ping-Versuche zu google auswerten. Das heißt ich habe ein Textdokument, wie es unten ist, und möchte daraus mit Gnuplot Grafiken erstellen, die z.B. alle Werte mal so erfassen, inklusive Mittelwert usw.
Das Textdokument sieht so aus:

1378899361
PING www.google.de (173.194.35.191): 56 data bytes
64 bytes from 173.194.35.191: seq=0 ttl=50 time=9.964 ms
64 bytes from 173.194.35.191: seq=1 ttl=50 time=9.825 ms
64 bytes from 173.194.35.191: seq=2 ttl=50 time=9.782 ms
64 bytes from 173.194.35.191: seq=3 ttl=50 time=9.784 ms
64 bytes from 173.194.35.191: seq=4 ttl=50 time=9.858 ms
64 bytes from 173.194.35.191: seq=5 ttl=50 time=9.864 ms
64 bytes from 173.194.35.191: seq=6 ttl=50 time=9.789 ms
64 bytes from 173.194.35.191: seq=7 ttl=50 time=9.800 ms
64 bytes from 173.194.35.191: seq=8 ttl=50 time=10.017 ms
64 bytes from 173.194.35.191: seq=9 ttl=50 time=9.754 ms

--- www.google.de ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 9.754/9.843/10.017 ms
1378899797
PING www.google.de (173.194.44.63): 56 data bytes
64 bytes from 173.194.44.63: seq=0 ttl=50 time=10.062 ms
64 bytes from 173.194.44.63: seq=1 ttl=50 time=9.775 ms
64 bytes from 173.194.44.63: seq=2 ttl=50 time=9.773 ms
64 bytes from 173.194.44.63: seq=3 ttl=50 time=10.084 ms
64 bytes from 173.194.44.63: seq=4 ttl=50 time=9.777 ms
64 bytes from 173.194.44.63: seq=5 ttl=50 time=9.821 ms
64 bytes from 173.194.44.63: seq=6 ttl=50 time=9.775 ms
64 bytes from 173.194.44.63: seq=7 ttl=50 time=9.805 ms
64 bytes from 173.194.44.63: seq=8 ttl=50 time=9.865 ms
64 bytes from 173.194.44.63: seq=9 ttl=50 time=9.825 ms

--- www.google.de ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 9.773/9.856/10.084 ms
1378902961
PING www.google.de (173.194.35.184): 56 data bytes
64 bytes from 173.194.35.184: seq=0 ttl=50 time=9.944 ms
64 bytes from 173.194.35.184: seq=1 ttl=50 time=9.729 ms
64 bytes from 173.194.35.184: seq=2 ttl=50 time=9.670 ms
64 bytes from 173.194.35.184: seq=3 ttl=50 time=9.644 ms
64 bytes from 173.194.35.184: seq=4 ttl=50 time=9.732 ms
64 bytes from 173.194.35.184: seq=5 ttl=50 time=9.716 ms
64 bytes from 173.194.35.184: seq=6 ttl=50 time=9.754 ms
64 bytes from 173.194.35.184: seq=7 ttl=50 time=9.681 ms
64 bytes from 173.194.35.184: seq=8 ttl=50 time=9.753 ms
64 bytes from 173.194.35.184: seq=9 ttl=50 time=9.751 ms

Nun stehen da natürlich viele Informationen, die mich gar nicht interessieren, relevant sind für mich erst mal nur die Zeiten.
Meine Frage dazu ist, wie ich das automatisch auslesen lassen kann...Vermutlich wird es ja einen Befehl geben, mit dem ich steuern kann, dass die Zahl, die hinter "time=" steht benutzt werden soll, vielleicht sogar in einem neuen Dokument, das ich dann zum Plotten benutzen kann, abgelegt werden.
Hat jemand da eine Idee, wie ich das sinnvoll hinkriege? Ich bin da sehr ratlos...
Liebe Grüße, Tiguana
BlackJack

@Tiguana: Die Grundsätzliche herangehensweise unterscheided sich in Python eigentlich nicht von C oder Java. Man würde die Datei halt zeilenweise verarbeiten und in den relevanten Zeilen mit Stringoperationen und/oder regulären Ausdrücken die Informationen isolieren die einen interessieren.

Falls Dich tatsächlich nur die `time=`-Werte interessieren, dann suchst Du halt in jeder Zeile nach 'time=' und extrahierst den Teil nach dem `=` und wandelst den in eine Zahl um. Wobei man natürlich ein bisschen aufpassen muss ob das alles in der Datei genau *so* aussieht. Also zum Beispiel ob es bei Verzögerungen nicht auch mal '1.23 s', also Sekundenangaben statt Millisekunden, sein können. Wenn man sich da nicht sicher ist, sollte man deshalb nicht einfach das 'ms' ignorieren, sondern mindestens prüfen ob nach der Zeitangabe auch tatsächlich die Einheit 'ms' steht und falls nicht eine Warnung ausgeben. Oder die Einheit auswerten und Sekunden beispielsweise in Millisekunden umrechnen.
Tiguana
User
Beiträge: 4
Registriert: Dienstag 2. Dezember 2014, 11:13

Erst mal vielen Dank für die Antwort.
Mir ist schon klar, wie das theoretisch funktioniert, allerdings fehlt mir da das technische Know-How, ich weiß also nicht, wie sich das in Python realisieren lässt...
BlackJack

@Tiguana: Was für praktische Probleme gibt es denn konkret? Grundlegende Zeichenketten- und Dateioperationen werden soweit ich weiss im Tutorial in der Python-Dokumentation behandelt, ansonsten gibt es dafür noch die Referenzdokumentation. Das `re`-Modul ist dokumentiert und es gibt in der Dokumentation auch ein HOWTO.

Ein Blick in den Style Guide for Python Code lohnt sich. Und für Leute mit Java-Hintergrund vielleicht Python is not Java.
Tiguana
User
Beiträge: 4
Registriert: Dienstag 2. Dezember 2014, 11:13

Vielen Dank für die Hinweise, ich werde mir das mal alles genauer anschauen ;)

Aber eine Frage habe ich direkt: mit dem nachfolgenden Code gehe ich das Dokument durch (in Zeilen ist der Inhalt der Seite gespeichert) und suche nach den Stichworten "time=", wie kann ich jetzt dem Programm sagen, dass es die Zeichen danach beachten soll und diese dann als Gleitkommazahl einer Liste anhängen soll (also mit append?)

time = "time="
for time in Zeilen:
.....
.....
BlackJack

@Tiguana: Also erst einmal durchsucht Du da nichts nach 'time='. Den Namen `time` vor der Schleife an etwas zu binden und die Schleife selbst dann auch mit `time` als Laufvariable zu schreiben macht wenig Sinn. Ausser falls man erwartet das die Schleife gar nicht durchlaufen wird, weil `Zeilen` leer ist, dann hätte man `time` an 'time=' gebunden. Ich sehe hier aber nicht warum man das wollte.

Du suchst da gerade nach Grundoperationen auf Zeichenketten die im Tutorial behandelt werden. Arbeite das doch mal durch, dann klären sich solche Fragen schon.
Tiguana
User
Beiträge: 4
Registriert: Dienstag 2. Dezember 2014, 11:13

so, bei mir klappt so weit alles...habe jetzt ein problem mit gnuplot, vielleicht kennt sich damit ja noch jemand aus?
ich habe einzelne werte wie maximum, minimum, etc. mit python bestimmen lassen und in einer seperaten datei abgespeichert
nun will ich quasi die werte als gerade (also parallel zur x-achse) zu meinen daten plotten...gibt es dazu irgendeinen bestimmten befehl, wie ich aus einem wert so eine linie erzeugen kann?
meine daten sehen in etwas so aus:

82.85 3.544 15.77 13.05

also einfach nur ein paar werte nebeneinander, als einzelne punkte klappt es sie zu plotten, nur weiß ich nicht, wie ich da jetzt eine linie mache, die durch den ganzen plot geht...
vielen dank!
Antworten