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

曲珂 发布于 2012/07/21 09:32
阅读 265
收藏 0
程序目的: 通过日志分析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
E
Express
你被自己的数据结构搞晕了吧~~第一个元素是第一个文件的流量,你读完第一个文件,当然就保存住了不会变了。还有你读文件的次数有点多吧。
0
曲珂

ip_flow{ip:[0,0]} 字典存储所有ip的流量

fn_num 控制 字典(ip_flow)中key(ip)对应value(是一个列表)的索引

读取第一个文件 fn_num=0  对应列表的第一个元素

读取第二个文件 fn_num=1 对应列表的第二个元素 

并没有操作列表中的第一个元素啊 ?

性能问题先不用考虑

0
天国之翼
天国之翼

print fn_num,ip, ip_flow[ip][fn_num]

ps:i have forget how use python ==! (in en os . sorry!) 

返回顶部
顶部