2013-11-27 70 views
0

我在Python中使用sed將日誌文件中的文本讀入單個字符串。解析可變長度python字符串的成員

下面是一個命令:

sys_output=commands.getoutput('sed -n "/SYS /,/Tot /p" %s.log' % cim_input_prefix) 

,這裏是sys_output

SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME  
    1 RHF  CCSD  18 21 59 89  92  1.6163 
    2 RHF  CCSD  4 7 22 36  2  0.0036 
Tot            94  1.6199 
SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME 
    1 RHF  CCSD  4 4 14 19  1  0.0002 
Tot            1  0.0002 
SYS SCFTYP METHOD  NC NO NU NBS MEMORY CPU TIME 
    1 RHF  CCSD  4 9 36 55  8  0.0416 
    2 RHF  CCSD  18 25 73 108  200  5.3587 
    3 RHF  CCSD  4 10 29 48  6  0.0217 
Tot           214  5.4221 

其中有三組,[2,1,3]行感興趣的打印輸出。

我的腳本遇到的日誌文件可能有可變數量的組和行,所以我不能簡單地拆分字符串並提取有用的信息。

我對組和行以及內存列的索引感興趣。

如何可以解析這個大串獲得一本字典,如:

{'1-1': 92, '1-2': 2, '2-1': 1, '3-1': 8, '3-2': 200, '3-3': 6}? 

非常感謝您的寶貴時間

+2

你有沒有嘗試過的東西? – slider

+0

我已經嘗試將sys_output保存到文本文件,並通過查找以整數開頭的行數來保存子系統數的計數。我可以用子系統的數量來表示內存價值的指數,如果我可以通過類似的方法計算出有多少個grups。 – keipertk

+0

爲什麼不能使用split來獲取信息?我認爲它會工作。 – aIKid

回答

1

一些樣的狀態機的基礎上,輸出的特定特徵可能讓生活更容易,而不是過於擔心指數。

該代碼片段適用於該示例,可以定製用於處理角落案例。

import collections 

with open("cpu_text", "r") as f: 
    lines = f.readlines() 

lines = [line.strip() for line in lines] 

group_id = 0 
group_member_id = 0 
output_dict = collections.OrderedDict() 

for line in lines: 
    if line.find("SYS") > -1: 
     group_id += 1 
    elif line.find("Tot") > -1: 
     group_member_id = 0 
    else: 
     group_member_id += 1 
     key = "{0}-{1}".format(group_id, group_member_id) 
     memory = line.split()[7] 
     output_dict[key] = memory 

print(output_dict) 

輸出:

OrderedDict([('1-1', '92'), ('1-2', '2'), ('2-1', '1'), ('3-1', '8'), ('3-2', '200'), ('3-3', '6')]) 
+0

這非常有幫助,並且是解決問題的有用方法。非常感謝。 – keipertk