Chinaunix
标题:
自己写的程序有bug,但是不知道是哪里出了问题
[打印本页]
作者:
txwsqk
时间:
2012-07-21 09:21
标题:
自己写的程序有bug,但是不知道是哪里出了问题
本帖最后由 txwsqk 于 2012-07-21 09:24 编辑
程序目的: 通过日志分析ip流量
描述: 一个目录下有N个日志文件,文件名是"Bps"开头的
文件内容格式:
10.0.0.100 192.168.0.100 100
10.0.0.200 172.16.0.100 100
10.0.0.100 10.0.0.200 100
172.16.0.100 10.0.0.200 100
每一行有3列,第一列源ip,第二列目的ip,第三列 流量
统计方法: 不管这个ip是源ip 还是 目的ip 流量都要加起来
每一个ip在文件里会出现多次
好了 下面是我写的脚本
#!/usr/bin/python
import glob
#store all ip address
#把ip存到一个集合里,就不用考虑重复添加的问题
ip_list = set()
#这个for循环就是为了获取所有文件中出现过的ip
#fn_num表示有多少个文件
fn_num = 0
for fn in glob.glob('Bps*'):
for line in open(fn,'r'):
src_ip, dest_ip, flow = line.split()
ip_list.add(src_ip)
ip_list.add(dest_ip)
fn_num += 1
#ip_flow初始化数据结构
#数据结构如下 ip_flow={'ip':[0,0]}
#ip地址作为字典的key,value是用列表来存储每个文件中这个ip的总流量,有几个文件,列表中就有几个元素
ip_flow = {}.fromkeys(list(ip_list),[0] * fn_num)
fn_num = 0
#第一个for循环所有的文件
for fn in glob.glob('Bps*'):
#第二个循环所有ip
for ip in ip_list:
flows = 0
#第三个循环每个文件的内容
for line in open(fn):
src_ip, dest_ip, flow = line.split()
if ip == src_ip or ip == dest_ip:
flows += int(flow)
ip_flow[ip][fn_num] = flows
#这个print调试用
print fn_num,ip,ip_flow[ip]
fn_num += 1
复制代码
我的到的结果如下
0 172.16.0.100 [200, 0]
0 192.168.0.100 [100, 0]
0 10.0.0.100 [200, 0]
0 10.0.0.200 [300, 0]
1 172.16.0.100 [300, 200]
1 192.168.0.100 [300, 100]
1 10.0.0.100 [300, 200]
1 10.0.0.200 [300, 300]
疑问:
为什么循环读完第一个文件后,列表中的第一个元素都变成上一次循环的300 ???
谢谢
作者:
inpool
时间:
2012-07-21 13:12
在贴吧回过你了,你这样绕弯了。
import glob
files = glob.glob(r'd:\tt\Bps*')
result = {}
for idx, bpsfile in enumerate(files):
for line in file(bpsfile):
sip, dip, flow = line.split(' ')
result.setdefault(sip, [0]*len(files))[idx] += int(flow)
result.setdefault(dip, [0]*len(files))[idx] += int(flow)
复制代码
result就是你要的结果
作者:
txwsqk
时间:
2012-07-21 15:31
感谢楼上指教,还是对基础的几个函数不熟 ,受教了
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2