2

ここでこの質問を見つけることができなかったことに驚きました。

telnet 応答から 1 行を抽出して変数にしたいと思います。(実際にはその行の 1 つの数字)。telnet.read_until() を使用して必要な場所まで抽出できますが、最初の部分はまだそこにあります。印刷物には、マシンのさまざまなステータスが表示されます。

私が取得しようとしている行は、次のようにフォーマットされています。

CPU Utilization          : 5 %

本当に必要なのは数字だけですが、残りの出力には「:」と「%」の文字がたくさんあります。この値を抽出するのを手伝ってくれる人はいますか? 前もって感謝します!

これが私のコードです(これは出力全体を読み取り、印刷します):

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")

編集:出力が何であるかのいくつかの例:

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
4

4 に答える 4

6

あなたが質問で言うように:

を使用して必要な場所まで抽出できますtelnet.read_until()が、最初の部分はまだそこにあります。

したがって、必要な行までのすべての行を変数に入れることができますoutput。あなたが見逃しているのは、その文字列の最後の行だけを取得する方法だけですよねoutput?

それは簡単です: 行に分割outputして最後の行を取るだけです:

output.splitlines()[:-1]

または、最後の行を分割するだけです。

output.rpartition('\n')[-1]

これは出力を変更しません。これは、新しい値を計算する単なる式です ( の最後の行output)。したがって、これをprint(output)実行してから を実行しても、目に見える有用なことは何もありません。

もっと簡単な例を見てみましょう:

a = 3
a + 1
print(a)

それは明らかに印刷されます3。を印刷する場合は4、次のようなものが必要です。

a = 3
b = a + 1
print(b)

したがって、実際の例に戻ると、おそらく次のようなものが必要になります。

line = output.rpartition('\n')[-1]
print(line)

そして今、あなたはこれを見るでしょう:

CPU Utilization          : 5 %

もちろん、残りの行から番号を抽出するには、ジョニーのコードのようなものが必要です。

numbers = [int(s) for s in line.split() if s.isdigit()]
print(numbers)

これで次のようになります。

['5']

1 つの文字列のリストが表示されることに注意してください。1 つの文字列だけが必要な場合は、まだ別の手順があります。

number = numbers[0]
print(number)

これにより、次のことが得られます。

5

そして最後に、整数ではなくnumber文字 です。それが必要な場合は、最後のビットを次のように置き換えます。'5'5

number = int(numbers[0])
print(number)

これでもが出力され 5ますが、実際に数値として使用できる変数ができました。

print(number / 100.0) # convert percent to decimal

私は がtelnet行末を として定義\r\nしているという事実に依存しており、間違った telnet 互換性のないサーバーはほぼ確実に Windows スタイル (また\r\n) または Unix スタイル (単に\n)のいずれかを使用します。行末。したがって、分割する\nと、厄介なサーバーであっても、常に最後の行が取得されます。その余分な堅牢性について心配する必要がない場合は、\r\nの代わりに分割できます\n


これを解決する方法は他にもあります。おそらく、のようなものを使用するかsession.expect([r'CPU Utilization\s*: (\d+)\s*%'])、セッションを行の反復子 (ファイルなど) としてラップしてから、標準的なitertoolsソリューションを作成するだけです。しかし、これはあなたがすでに持っているものを考えると最も簡単なようです.

于 2013-04-26T19:25:31.680 に答える
1

数字だけを取得したい場合:

>>> output = "CPU Utilization          : 5 %"
>>> [int(s) for s in output.split() if s.isdigit()]
[5]

>>> output = "CPU Utilization          : 5 % % 4.44 : 1 : 2"
>>> [int(s) for s in output.split() if s.isdigit()]
[5, 4.44, 1, 2]

編集:

for line in output:
    print line # this will print every single line in a loop, so you can make:
    print [int(s) for s in line.split() if s.isdigit()]
于 2013-04-26T19:31:50.080 に答える
0
In [27]: mystring= "% 5 %;%,;;;;;%"
In [28]: ''.join(c for c in mystring if c.isdigit())
Out[28]: '5'

より速い方法:

def find_digit(mystring):
    return filter(str.isdigit, mystring)

find_digit(mystring)
5
于 2013-04-26T19:29:19.730 に答える