Wie kann ich das Lesen einer Zeile aus eine telnet-Antwort mit Python?
War ich überrascht, dass ich nicht finden konnte, diese Frage hier.
Ich würde gerne nehmen, extrahieren Sie eine Zeile aus eine telnet-Antwort und machen es zu einem Variablen. (eigentlich eine Zahl aus der Zeile). Ich kann Sie extrahieren, bis zu, wo ich noch über telnet.read_until(), aber der ganze Anfang ist immer noch da. Der Ausdruck zeigt die verschiedenen Zustände einer Maschine.
Die Linie, die ich versuche zu bekommen ist wie folgt formatiert:
CPU Utilization : 5 %
Ich muss echt nur die Anzahl, aber es gibt viele ':' und '%' Zeichen in den rest der Ausgabe. Kann mir jemand helfen, extrahieren Sie das Wert? Vielen Dank im Voraus!
Hier ist mein code (dieser liest die gesamte Ausgabe und Drucke):
import telnetlib, time
print ("Starting Client...")
host = input("Enter IP Address: ")
timeout = 120
print ("Connecting...")
try:
session = telnetlib.Telnet(host, 23, timeout)
except socket.timeout:
print ("socket timeout")
else:
print("Sending Commands...")
session.write("command".encode('ascii') + b"\r")
print("Reading...")
output = session.read_until(b"/r/n/r/n#>", timeout )
session.close()
print(output)
print("Done")
Edit: einige Beispiel dafür, was eine Ausgabe könnte sein:
Boot Version : 1.1.3 (release_82001975_C)
Post Version : 1.1.3 (release_82001753_E)
Product VPD Version : release_82001754_C
Product ID : 0x0076
Hardware Strapping : 0x004C
CPU Utilization : 5 %
Uptime : 185 days, 20 hours, 31 minutes, 29 seconds
Current Date/Time : Fri Apr 26 17:50:30 2013
:
und %
, bitte zeigen Sie uns einige weitere Beispiel-Ausgabe-Zeilen, so können wir Ihnen besser AntwortenHinzugefügt und Bearbeiten von Linien
InformationsquelleAutor mad5245 | 2013-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
- Wie Sie sagen-in die Frage:
So können Sie alle Zeilen bis einschließlich die, die Sie wollen in eine variable
output
. Das einzige, was Ihnen fehlt, ist, wie man nur in der letzten Zeile, dassoutput
string, richtig?Das ist einfach: split
output
in Linien und nehmen die Letzte:Oder nur split aus der letzten Zeile:
Dies ändert nichts an der Ausgabe, es ist nur ein Ausdruck, der berechnet einen neuen Wert (die Letzte Zeile in
output
). So, eben dies zu tun, gefolgt vonprint(output)
, nicht alles sichtbar nützlich.Nehmen wir ein einfacheres Beispiel:
Offensichtlich Drucklegung
3
. Wenn Sie drucken möchten4
, brauchen Sie etwas wie dieses:Also, gehen wir zurück zu dem Beispiel, was Sie wollen, ist wahrscheinlich so etwas wie dieses:
Und jetzt sehen Sie:
Natürlich, Sie noch etwas brauchen, wie Johnny der code zum extrahieren der Nummer aus dem rest der Zeile:
Nun bekommst du dieses:
Beachten Sie, dass gibt Ihnen eine Liste von einem string. Wenn Sie wollen, die eine Zeichenfolge, haben Sie immer noch ein weiterer Schritt:
Gibt Sie:
Und schließlich
number
ist immer noch die string'5'
, nicht die ganze Zahl5
. Wenn Sie möchten, ersetzen Sie das Letzte Stück mit:Diese wird noch drucken Sie
5
, aber jetzt haben Sie eine variable, die Sie tatsächlich nutzen können, als eine Zahl ein:Ich bin abhängig von der Tatsache, dass
telnet
definiert die end-of-line-als\r\n
, und alle nicht-ganz-telnet-kompatiblen server, der es falsch versteht ist fast sicher gehen, um zu verwenden, entweder Windows-Stil (auch\r\n
) oder im Unix-Format (nur\n
) Zeilenenden. So, die Teilung auf\n
wird immer die Letzte Zeile, auch für screwy Server. Wenn Sie brauchen nicht zu befürchten, dass zusätzliche Robustheit, können Sie split auf\r\n
statt\n
.Gibt es andere Möglichkeiten, Sie könnten dieses Problem lösen. Ich würde wohl entweder so etwas wie
session.expect([r'CPU Utilization\s*: (\d+)\s*%'])
, oder wickeln Sie die Sitzung, wie ein iterator von Zeilen (wie eine Datei) und dann eben schreiben, die standard -itertools
Lösung. Aber das scheint am einfachsten sein angesichts dessen, was Sie bereits haben.read_until
, richtig? So, um die Letzte dieser Linien (das ist die, die Sie wollen), tun Sie einfach dasread_until
, und dann nehmen Sie die Letzte Zeile wie oben gezeigt.Was bedeutet "nicht für mich arbeiten"? Wenn Sie nur die Berechnung
output.rpartition(b'\r\n')[-1]
und nicht speichern oder drucken oder anderweitig verwenden das Ergebnis, es wird nicht sehr nützlich sein...Für jede Liste (oder andere Reihenfolge)
foo
,foo[-1]
ist das Letzte element. Dierpartition(b'\r\n')
Funktion gibt alles bis auf den letztenb'\r\n'
, dann dieb'\r\n'
selbst, dann wird alles nach es. Also, setzen Sie zusammen, bekommt dieser alles nach. Sind Sie sicher, dass Sie tatsächlich habenb'\r\n'
eher alsb'\n'
oder eine andere Linie endet in deinem string? (Haben Sie versucht, die Protokollierung seinerrepr
sicherstellen?)Inzwischen, was heißt "Es ist nicht nur die Letzte Zeile"? Was ist "es" hier? Wieder, müssen Sie verwenden Sie das Ergebnis des Ausdrucks. Es ist nicht zu ändern
output
oder jede andere variable, in-place, wenn es das ist, was Sie erwarten.Wieder einmal, nur zum telefonieren
partition
aufoutput
nicht ändernoutput
oder jede andere variable. Es gibt einen neuen Wert ein. Sie haben, zu speichern, dass der neue Wert in einer anderen variable, oder drucken Sie es aus, oder was auch immer, wenn Sie wollen, um in irgendeiner Weise zu verwenden. Ich bin mir nicht sicher, wie ich das erklären kann, mehr einfach, aber ich werde versuchen, die Bearbeitung einige Beispiel-code in zu beantworten, um zu sehen, ob es hilft.InformationsquelleAutor abarnert
So, ich verstehe das problem, Sie möchten, wählen Sie 1 Zeile aus einem block mit Zeilen, aber nicht unbedingt die Letzte Zeile.
Die Zeile, die Sie interessiert, beginnt immer mit "CPU-Auslastung"
Sollte dies funktionieren:
read_until
endet immer mit der "CPU-Auslastung" - Linie, so gibt es keine Notwendigkeit, dies zu tun.Außerdem, warum würde Sie explizit aufrufen
line.__contains__(foo)
statt nur überfoo in line
?Du hast Recht, foo in Zeile funktioniert genauso gut.
Eigentlich ist der OP gesagt, "eigentlich will ich eine Zeile in der Mitte der Ausgabe. Und es ist nicht in einer statischen position "
Also diese Methode ist mir gleich als abarnert Methode. Es gibt mir alle Daten bis einschließlich der Zeile, die ich brauche. Gibt es einen import-ich muss dass ich bin fehlt?
InformationsquelleAutor jwygralak67
Wenn Sie möchten, Holen Sie sich nur die zahlen:
EDIT:
nur loop-through-Ausgang (siehe mein EDIT)
Die Schleife durch die Ausgabe nicht helfen. Er will nur die CPU-Auslastung, die Anzahl, nicht jede Nummer.
InformationsquelleAutor Johnny
schneller Weg :
"CPU Utilization : 5 % % 4.44 : 1 : 2"
erhalten Sie die Anzahl 544412. Und es gibt keinen Grund, es zu brechen von Zeichen und treten Sie dann zurück in eineword
; gegeben, dass seine Zahl ist deutlich Leerzeichen getrennt, Sie können gehen Sie einfach Wort für Wort in den ersten Platz.auch bin ich davon ausgegangen, es ist die einzige Zahl, wie es geschrieben steht in der Frage:
but there are many ':' and '%' characters in the rest of the output
Lesen Sie seine Kommentare auf die anderen Antworten. Zum Beispiel, "gibt Es noch weitere Einstellungen vor und nach...", und vermutlich werden diese Einstellungen von Linien haben zahlen, sowie Komma und Prozent.
er veröffentlicht dieses Zeug nach dem Absenden meiner code. er hat vermutlich sollte setzen Sie diese Informationen in der ursprünglichen Frage
Vereinbart, sollte er. Aber eine Antwort, die nicht nützlich für die OP 's (oder jemand' s) eigentliche problem nicht hilfreich, nur weil es technisch korrekt, wegen der OP nicht erklärt hat, seine Frage richtig.
InformationsquelleAutor Moj