2016-06-07 49 views
0

我需要從設備獲取(解析)其整個輸出。只讀部分已知行 - 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

回答

0

您應該再次閱讀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功能。 –