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在文件里会出现多次

好了 下面是我写的脚本
  1. #!/usr/bin/python

  2. import glob

  3. #store all ip address
  4. #把ip存到一个集合里,就不用考虑重复添加的问题
  5. ip_list = set()

  6. #这个for循环就是为了获取所有文件中出现过的ip
  7. #fn_num表示有多少个文件
  8. fn_num = 0
  9. for fn in glob.glob('Bps*'):
  10.     for line in open(fn,'r'):
  11.         src_ip, dest_ip, flow = line.split()
  12.         ip_list.add(src_ip)
  13.         ip_list.add(dest_ip)
  14.     fn_num += 1

  15. #ip_flow初始化数据结构
  16. #数据结构如下 ip_flow={'ip':[0,0]}
  17. #ip地址作为字典的key,value是用列表来存储每个文件中这个ip的总流量,有几个文件,列表中就有几个元素
  18. ip_flow = {}.fromkeys(list(ip_list),[0] * fn_num)

  19. fn_num = 0
  20. #第一个for循环所有的文件
  21. for fn in glob.glob('Bps*'):
  22. #第二个循环所有ip
  23.     for ip in ip_list:
  24.         flows = 0
  25. #第三个循环每个文件的内容
  26.         for line in open(fn):
  27.             src_ip, dest_ip, flow = line.split()
  28.             if ip == src_ip or ip == dest_ip:
  29.                 flows += int(flow)
  30.         ip_flow[ip][fn_num] = flows
  31. #这个print调试用
  32.         print fn_num,ip,ip_flow[ip]
  33.     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
在贴吧回过你了,你这样绕弯了。
  1. import glob

  2. files = glob.glob(r'd:\tt\Bps*')
  3. result = {}

  4. for idx, bpsfile in enumerate(files):
  5.     for line in file(bpsfile):
  6.         sip, dip, flow = line.split(' ')
  7.         result.setdefault(sip, [0]*len(files))[idx] += int(flow)
  8.         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