2013-02-23 226 views
0

我有一個半徑捕獲文件,我需要解析它。我如何獲取各個值對並將它們聚合。以下是該文件的一個快速片段:解析Python捕獲文件

Acct-Session-Id = "1234adb" 
Acct-Session-Time = 141312 
Acct-Input-Octets = 1234123 

這樣重複,並持續具有相同的結構但不同的值。

我需要聚合Octets,這很容易,因爲我只是做"if "Acct-Input-Octets" in結構。

如果會話時間變爲0(即他們重新連接),總問題就會發生改變。因此,運行總數需要重置,除非它不是在這種情況下它是一個錯誤(在RADIUS輸入 - 八位字節必須用新的會話ID重置)。

回答

0

是這樣的嗎?

totals = 0 
for line in fileObj: 
    name, value = line.split('=') 
    if name.strip() == 'Acct-Session-Time' and value.strip() == '0': 
     totals = 0 
    elif name.strip() == 'Acct-Input-Octets': 
     totals += int(value.strip()) 
+0

謝謝你,那更接近我需要的地方。麻煩的是,我試圖弄錯了,所以我遇到的問題(或者也許是我的睡眠不足)。 但是我想捕獲的是會話時間重置但使用不會重置爲0的特定錯誤。換句話說,我必須比較值對,而不是僅將總數重置爲0. – 2013-02-24 00:57:28

+0

那麼,在這個例子之後,您可以輕鬆記住您需要進行比較的更多值。 *「我試圖弄錯」* - 錯誤是什麼?你爲什麼不展示你到目前爲止提出的代碼,我們會盡力幫助你? – poke 2013-02-24 01:01:40

+0

@JacekPerry你的意思是說,對於每個Acct-Session-Time是0的下一行Acct-Input-Octets也應該是0?否則應該提出錯誤? – jurgenreza 2013-02-24 01:15:03

0

這裏是一個正則表達式的方法:

步驟:

1-閱讀時間和八位位組爲兩個列表

2-去了時間和存儲的「0的最後一個索引'元素,同時檢查八位位組的相同索引,並確保它是否爲'0',如果不是,則拋出異常

3-將從尾部到最後一個索引'0 '

import re 

log = open('log.txt').read() 

times = re.findall('Acct-Session-Time\s*=\s*(\d+)\s*', log) 
octets = re.findall('Acct-Input-Octets\s*=\s*(\d+)\s*', log) 

last_zero_index = 0 

for i in range(0, len(times)): 
    if times[i] == '0': 
     last_zero_index = i 
     if octets[i] != '0': 
      raise Exception('Session time is reset but the usage is not') 

totals = 0 

for value in octets[-last_zero_index:]: 
    totals += int(value) 

print(totals)