描述: 一个目录下有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 ???
谢谢
ip_flow{ip:[0,0]} 字典存储所有ip的流量
fn_num 控制 字典(ip_flow)中key(ip)对应value(是一个列表)的索引
读取第一个文件 fn_num=0 对应列表的第一个元素
读取第二个文件 fn_num=1 对应列表的第二个元素
并没有操作列表中的第一个元素啊 ?
性能问题先不用考虑
print fn_num,ip, ip_flow[ip][fn_num]
ps:i have forget how use python ==! (in en os . sorry!)