2016-06-07 6 views
0

Ich muss von einem Gerät seine gesamte Ausgabe (parse) bekommen.Lesen bis eine nur teilweise bekannte Zeile - Python

Meine Lösung war: 1) Ermitteln Sie, wie die letzte Zeile der Ausgabe wie

2) Verwenden Sie den Code sieht unter die Ausgabe bis zur letzten Zeile zu lesen (das ist ein Weg, um zu sagen ist - lesen Sie das ganze Ausgang)

last_line = "text of the last line" 
read_until(last_line) 

3) Technisches Detail: macht es zu einem return Wert der get_output() als Mittel um es weiter zu einer parse_result() Funktion übergeben.

Das Problem ist: Die letzte Zeile kann verschiedene Formen annehmen und nur sein grobes Format ist bekannt. Zum Beispiel könnte es sagen: {"diag":"hdd_id", "status":"0"}. Jedoch können sowohl "diag" als auch "status" andere Werte als "hdd_id" und "0" annehmen.

Was kann ich tun, um den "Text der letzten Zeile" universeller zu machen, so dass die read_until() für jeden Wert von "diag" und "status" stoppt? (vorausgesetzt, der Ausgang enthält immer die Worte "diag" und "status")

Was ich versucht habe: Mit regulären Ausdrücken. Definieren last_line = re('"status":"."}') mit der Tatsache, dass . im regulären Ausdruck bedeutet einen beliebigen Wert. Was ich bekomme, ist TypeError: 'module' object is not callable.

Es wäre auch nicht viel Sinn machen, dass die regulären Ausdruck von str(re('"status":"."}')) da, so weit in eine Zeichenfolge zu konvertieren, wie ich reguläre Ausdrücke verstehen, wäre es keine bestimmte Zeichenfolge (wegen .) bedeuten.

+0

Können Sie etwas Code posten? Ist 'read_until' eine Bibliotheksfunktion oder etwas, das du selbst schreibst? – tzaman

+0

'read_until' ist eine Bibliotheksfunktion von telnetlib.py - da die Ausgabe des Geräts über eine TelNet-Verbindung gelesen wird. Hier ist der wesentliche Teil ihrer Definition: 'def read_until (self, Spiel, timeout = None): """ Lesen Sie, bis eine bestimmte Zeichenfolge gefunden wird oder bis timeout.' – Bolo

Antwort

0

Sie sollten (wieder) das re Kapitel aus dem Handbuch der Python Standardbibliothek lesen.

Die korrekte Verwendung ist:

import re 
... 
eof = re.compile(r'\s*\{\s*"diag":.*,\s*"status":.*\}') # compile the regex 
... 

Der obige Ausdruck \s* verwendet für optionale Leerräume in der Leitung zu ermöglichen. Sie können sie entfernen, wenn Sie wissen, dass sie nicht auftreten können.

Sie können dann verwenden, mit dem telnetlib Python-Modul, aber mit expect statt read_until, weil die letztere sucht nach einem String und kein regex:

index, match, text = tn.expect([eof]) 

Hier Index wird der der Index der Matched Regex (hier 0), stimmen Sie das Match-Objekt, und Text den vollständigen Text einschließlich der letzten Zeile

+0

Das Problem hier ist der 'line' Teil Ich habe keinen Textblock, dessen Zeilen ich mit meinem Muster vergleichen könnte – Bolo

+0

Der erste Moment, an dem ich einen Textabschnitt (der weiter analysiert oder als Variable gespeichert und so angepasst werden kann) erhalten wird, ist wann Ich stoppe schon mein 'read_until' - und dazu muss ich einen universellen Haltepunkt definieren. – Bolo

+0

Siehe meine Bearbeitung: Sie haben nicht die richtige Telnetlib-Funktion verwendet. –

Verwandte Themen