只读部分已知行 - Python
我需要从设备获取(解析)其整个输出。只读部分已知行 - Python
我的解决办法是:1)确定其输出的最后一行看起来像
2)使用下面的代码读取输出,直到最后一行(这大约是一个跟你说 - 读整输出)
last_line = "text of the last line"
read_until(last_line)
3)技术细节:使其向get_output()
的return
值作为进一步传递到parse_result()
功能的装置。
问题是:最后一行可能采取各种形式,只有粗略的格式是已知的。例如,它可能会说:{"diag":"hdd_id", "status":"0"}
。但是,"diag"
和"status"
都可能采用除"hdd_id"
和"0"
之外的其他值。
我能做些什么来使“最后一行的文本”更具普遍性,以便read_until()针对每个“diag”和“status”值停止? (假设输出总是包含“diag”和“status”字样)
我试过了:使用正则表达式。定义last_line = re('"status":"."}')
利用正则表达式中的.
意味着任何值的事实。我得到的是TypeError: 'module' object is not callable
。
把这个正则表达式转换成字符串str(re('"status":"."}'))
也没有什么意义,因为就我所了解的正则表达式而言,它并不意味着任何特定的字符串(由于.
)。
您应该再次阅读Python标准库手册中的re
一章。
正确用法是:
import re
...
eof = re.compile(r'\s*\{\s*"diag":.*,\s*"status":.*\}') # compile the regex
...
上面表达式使用\s*
以允许在线路可选空格。如果你知道它们不可能发生,你可以将它们删除。
然后,您可以用telnetlib
Python模块使用它,但expect
代替read_until
,因为对于一个字符串,后者的搜索,而不是一个正则表达式:
index, match, text = tn.expect([eof])
这里,指数意志的索引匹配正则表达式(这里是0),匹配匹配对象,以及文本全文,包括最后一行
你能发表一些代码吗? 'read_until'是一个库函数还是你自己写的东西? – tzaman
'read_until'是telnetlib.py的库函数 - 因为设备的输出正通过TelNet连接读取。这里是它的定义的基本部分: 'def read_until(self,match,timeout = None): “”“直到遇到给定的字符串或直到超时为止.' – Bolo