只读部分已知行 - 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":"."}'))也没有什么意义,因为就我所了解的正则表达式而言,它并不意味着任何特定的字符串(由于.)。

+0

你能发表一些代码吗? 'read_until'是一个库函数还是你自己写的东西? – tzaman

+0

'read_until'是telnetlib.py的库函数 - 因为设备的输出正通过TelNet连接读取。这里是它的定义的基本部分: 'def read_until(self,match,timeout = None): “”“直到遇到给定的字符串或直到超时为止.' – Bolo

您应该再次阅读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),匹配匹配对象,以及文本全文,包括最后一行

+0

这里的问题是'line'部分。我没有任何文本,我可以尝试与我的模式相匹配的文本 – Bolo

+0

第一时间我将获得一段文本(能够被进一步解析或存储为变量,从而匹配)是什么时候我已经停止了我的'read_until' - 为此我需要定义一个通用停止点。 – Bolo

+0

看我的编辑:你没有使用正确的telnetlib功能。 –