免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1314 | 回复: 2
打印 上一主题 下一主题

自己写的程序有bug,但是不知道是哪里出了问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-21 09:21 |只看该作者 |倒序浏览
本帖最后由 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 ???

谢谢

论坛徽章:
0
2 [报告]
发表于 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就是你要的结果

论坛徽章:
0
3 [报告]
发表于 2012-07-21 15:31 |只看该作者
感谢楼上指教,还是对基础的几个函数不熟 ,受教了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP