2013-02-23 69 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)