如何过滤 python telnet print() 输出
How to filter python telnet print() output
我有几台投影仪,我使用 telnetlib 使用 python 脚本控制它们,效果很好。我还可以读取 telnet 输出以从中获取当前设置。
我遇到的问题是 telnet 输出给了我一些不需要的字符,我想过滤掉这些字符并只显示实际数据。
#CURRENT SCRIPT
import time
import telnetlib
import os
port = 555
ipaddr = ('10.0.0.171',
'10.0.0.172',
'10.0.0.173',)
for ip in ipaddr:
tn = telnetlib.Telnet(ip, port,)
time.sleep(0.1)
tn.write(b"*gamma ?\r")
time.sleep(0.1)
tn.write(b"*power ?\r")
time.sleep(0.1)
print(tn.read_eager(), end = ' ')
print("on " + ip)
print("----------------------------------------------------")
tn.close
os.system("pause")
输出如下所示:
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.171
----------------------------------------------------
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.172
----------------------------------------------------
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.173
----------------------------------------------------
Press any key to continue . . .
这基本上是 returns ACK 命令和末尾带有 \r\n 的数据
是否可以将它们过滤掉并在它们之间加上分隔符?
类似于:
| gamma = 3 | power = 1 | on 10.0.0.171
----------------------------------------------------
| gamma = 3 | power = 1 | on 10.0.0.172
----------------------------------------------------
| gamma = 3 | power = 1 | on 10.0.0.173
----------------------------------------------------
Press any key to continue . . .
或者如果将这些回复输出到弹出消息框中更简单?
或突出显示它们(不同颜色)?
正在使用 Python 3.7.3
Windows
非常感谢任何帮助,谢谢
大卫
您从 Telnet.read_eager() 方法获得字节 built-in 类型的实例,并且必须使用 bytes.decode() 方法将其解码为字符串。看下面的片段。
ip = '10.1.1.30'
bs = b'ack gamma = 3\r\nack power = 1\r\n'
print(type(bs))
s = bs.decode()
print(type(s))
s = s.replace('\r\n', ' | ')
print('| '+ s + 'on ' + ip)
输出:
<class 'bytes'>
<class 'str'>
| ack gamma = 3 | ack power = 1 | on 10.1.1.30
您可以使用 decode
:
将字节解码为 unicode 字符串
In [1]: bs = b'hello world'
In [2]: bs
Out[2]: b'hello world'
In [3]: bs.decode('utf-8')
Out[3]: 'hello world'
并且可以使用 encode
:
以相同的方式将字符串编码为字节
In [4]: s = '123456'
In [5]: s.encode()
Out[5]: b'123456'
然后与正则表达式一起获取您想要的信息。例如:
import re
s = b'ack gamma = 3\r\nack power = 1\r\n on 10.0.0.171'.decode('utf-8')
ip_addr = re.findall(r'\d+\.\d+\.\d+\.\d+', s)[0] # 10.0.0.171
我有几台投影仪,我使用 telnetlib 使用 python 脚本控制它们,效果很好。我还可以读取 telnet 输出以从中获取当前设置。
我遇到的问题是 telnet 输出给了我一些不需要的字符,我想过滤掉这些字符并只显示实际数据。
#CURRENT SCRIPT
import time
import telnetlib
import os
port = 555
ipaddr = ('10.0.0.171',
'10.0.0.172',
'10.0.0.173',)
for ip in ipaddr:
tn = telnetlib.Telnet(ip, port,)
time.sleep(0.1)
tn.write(b"*gamma ?\r")
time.sleep(0.1)
tn.write(b"*power ?\r")
time.sleep(0.1)
print(tn.read_eager(), end = ' ')
print("on " + ip)
print("----------------------------------------------------")
tn.close
os.system("pause")
输出如下所示:
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.171
----------------------------------------------------
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.172
----------------------------------------------------
b'ack gamma = 3\r\nack power = 1\r\n' on 10.0.0.173
----------------------------------------------------
Press any key to continue . . .
这基本上是 returns ACK 命令和末尾带有 \r\n 的数据
是否可以将它们过滤掉并在它们之间加上分隔符? 类似于:
| gamma = 3 | power = 1 | on 10.0.0.171
----------------------------------------------------
| gamma = 3 | power = 1 | on 10.0.0.172
----------------------------------------------------
| gamma = 3 | power = 1 | on 10.0.0.173
----------------------------------------------------
Press any key to continue . . .
或者如果将这些回复输出到弹出消息框中更简单? 或突出显示它们(不同颜色)?
正在使用 Python 3.7.3
Windows非常感谢任何帮助,谢谢
大卫
您从 Telnet.read_eager() 方法获得字节 built-in 类型的实例,并且必须使用 bytes.decode() 方法将其解码为字符串。看下面的片段。
ip = '10.1.1.30'
bs = b'ack gamma = 3\r\nack power = 1\r\n'
print(type(bs))
s = bs.decode()
print(type(s))
s = s.replace('\r\n', ' | ')
print('| '+ s + 'on ' + ip)
输出:
<class 'bytes'>
<class 'str'>
| ack gamma = 3 | ack power = 1 | on 10.1.1.30
您可以使用 decode
:
In [1]: bs = b'hello world'
In [2]: bs
Out[2]: b'hello world'
In [3]: bs.decode('utf-8')
Out[3]: 'hello world'
并且可以使用 encode
:
In [4]: s = '123456'
In [5]: s.encode()
Out[5]: b'123456'
然后与正则表达式一起获取您想要的信息。例如:
import re
s = b'ack gamma = 3\r\nack power = 1\r\n on 10.0.0.171'.decode('utf-8')
ip_addr = re.findall(r'\d+\.\d+\.\d+\.\d+', s)[0] # 10.0.0.171