如何用python实现文本处理

sushaoyang 2012-04-19 10:08:23
2012-04-18 12:33:33 192.168.13.106 218.16.121.240 80
2012-04-18 12:33:43 192.168.13.106 110.75.187.22 80
2012-04-18 12:34:13 192.168.65.27 192.168.0.188 443
2012-04-18 12:34:27 192.168.40.117 192.168.0.174 80
2012-04-18 12:35:39 192.168.20.109 119.147.113.98 80
2012-04-18 12:35:59 192.168.20.109 119.147.113.98 80
2012-04-18 12:36:13 192.168.65.27 192.168.0.189 443
2012-04-18 12:36:20 192.168.13.106 113.11.195.106 80
2012-04-18 12:36:26 192.168.50.112 192.168.0.174 80
2012-04-18 12:36:33 192.168.50.146 118.186.66.51 80
2012-04-18 12:36:43 192.168.30.105 192.168.0.174 80
2012-04-18 12:36:53 192.168.50.145 119.147.194.250 80
2012-04-18 12:37:01 192.168.40.105 192.168.0.174 80
2012-04-18 12:37:12 192.168.13.106 182.50.0.106 80
2012-04-18 12:37:33 192.168.13.106 182.50.0.106 80
2012-04-19 12:34:13 192.168.65.27 192.168.0.188 443


文本格式如上所示
希望统计出后三段相同的 他们的时间间隔有没有一定的周期
思路如下:
1、提取后三段相同的,列到一起
2、后三段相同的 他们的时间做差(这里会有跨天发生,python如何实现跨天的减法?)
3、统计出现最多的时间间隔所占的百分比,如果大于90%,就将此段信息输出到high.txt 并返回1
大于60%小于90% 输出到middle.txt 返回0
小于60%,输出到low.txt

等于说最后三个txt的格式应为(随便举例):
high.txt
192.168.13.106 182.50.0.106 80,95%
middle.txt
192.168.65.27 192.168.0.188 443,70%
low.txt
192.168.65.27 192.168.0.188 443,30%


...全文
244 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2012-04-19
  • 打赏
  • 举报
回复
就是用datetime.strptime(date_string, format) 这个函数把字串形式的时间数据转化成datetime对象。两个datetime对象相减就是timedelta对象,timedelta本身支持4则运算符号,你想统计算出百分比简单写+-*/即可,自己练练吧...
sushaoyang 2012-04-19
  • 打赏
  • 举报
回复
看了,这两天试着改了下,不过不行,没办法了才又发个贴
小弟一点编程基础都没有。。。[Quote=引用 4 楼 的回复:]

看看datetime模块里面的datetime和timedelta对象,貌似你上个帖别人回答的示范代码里有呀,没认真看吧...
[/Quote]
angel_su 2012-04-19
  • 打赏
  • 举报
回复
看看datetime模块里面的datetime和timedelta对象,貌似你上个帖别人回答的示范代码里有呀,没认真看吧...
sushaoyang 2012-04-19
  • 打赏
  • 举报
回复
小弟上周才接触python,不会写啊。。
[Quote=引用 2 楼 的回复:]

把时间转换成秒去做减法咯,这个题目做起来应该不难啊
[/Quote]
zengna_com 2012-04-19
  • 打赏
  • 举报
回复
把时间转换成秒去做减法咯,这个题目做起来应该不难啊
sushaoyang 2012-04-19
  • 打赏
  • 举报
回复
补充一下,python需要从/work/data/base_data.txt读数据 这个文件的内容如上所示
libralibra 2012-04-19
  • 打赏
  • 举报
回复
你需要把s那些字符串注释掉,把上面那行去掉注释让它读文件


import re
from datetime import datetime

# un-comment this line
# s = open(r'/work/data/base_data.txt').read()

# comment these lines
s = '''2012-04-18 12:33:33 192.168.13.106 218.16.121.240 80
2012-04-18 12:33:43 192.168.13.106 110.75.187.22 80
2012-04-18 12:34:13 192.168.65.27 192.168.0.188 443
2012-04-18 12:34:27 192.168.40.117 192.168.0.174 80
2012-04-18 12:35:39 192.168.20.109 119.147.113.98 80
2012-04-18 12:35:59 192.168.20.109 119.147.113.98 80
2012-04-18 12:36:13 192.168.65.27 192.168.0.189 443
2012-04-18 12:36:20 192.168.13.106 113.11.195.106 80
2012-04-18 12:36:26 192.168.50.112 192.168.0.174 80
2012-04-18 12:36:33 192.168.50.146 118.186.66.51 80
2012-04-18 12:36:43 192.168.30.105 192.168.0.174 80
2012-04-18 12:36:53 192.168.50.145 119.147.194.250 80
2012-04-18 12:37:01 192.168.40.105 192.168.0.174 80
2012-04-18 12:37:12 192.168.13.106 182.50.0.106 80
2012-04-18 12:37:33 192.168.13.106 182.50.0.106 80
2012-04-19 12:34:13 192.168.65.27 192.168.0.188 443'''

# srcIP->destIP:port = date time
dateDict = {}

# srcIP->destIP:port = number of slots
slotDict = {}

# total number of slots
totalNum = 0

# loop
for line in s.split('\n'):
items = line.split(' ')
if len(items)==5:
# total time slot
totalNum += 1

# new key
newkey = items[-3]+'->'+items[-2]+':'+items[-1]

# dateDict
if dateDict.has_key(newkey):
dateDict[newkey].append(items[0]+' '+items[1])
else:
dateDict[newkey] = [items[0]+' '+items[1]]

# slotDist
if slotDict.has_key(newkey):
slotDict[newkey] += 1
else:
slotDict[newkey] = 0

# write files
for k in slotDict.keys():
# ratio
ratio = slotDict[k]*1.0/totalNum

# line string
newline = k+', '+str(int(ratio*100))+'%\n'

# open file
if ratio>0.9:
fid = open('high.txt','a+')
elif 0.6<ratio<=0.9:
fid = open('middle.txt','a+')
elif ratio<=0.6:
fid = open('low.txt','a+')

# write, close
fid.write(newline)
fid.close()

print 'DONE!'


结果:(测试数据太少的里面都没有超过60%)
192.168.65.27->192.168.0.189:443, 0%
192.168.50.112->192.168.0.174:80, 0%
192.168.50.146->118.186.66.51:80, 0%
192.168.13.106->218.16.121.240:80, 0%
192.168.30.105->192.168.0.174:80, 0%
192.168.50.145->119.147.194.250:80, 0%
192.168.40.105->192.168.0.174:80, 0%
192.168.20.109->119.147.113.98:80, 6%
192.168.65.27->192.168.0.188:443, 6%
192.168.13.106->113.11.195.106:80, 0%
192.168.13.106->182.50.0.106:80, 6%
192.168.13.106->110.75.187.22:80, 0%
192.168.40.117->192.168.0.174:80, 0%
192.168.65.27->192.168.0.189:443, 0%
192.168.50.112->192.168.0.174:80, 0%
192.168.50.146->118.186.66.51:80, 0%
192.168.13.106->218.16.121.240:80, 0%
192.168.30.105->192.168.0.174:80, 0%
192.168.50.145->119.147.194.250:80, 0%
192.168.40.105->192.168.0.174:80, 0%
192.168.20.109->119.147.113.98:80, 6%
192.168.65.27->192.168.0.188:443, 6%
192.168.13.106->113.11.195.106:80, 0%
192.168.13.106->182.50.0.106:80, 6%
192.168.13.106->110.75.187.22:80, 0%
192.168.40.117->192.168.0.174:80, 0%
sushaoyang 2012-04-19
  • 打赏
  • 举报
回复
还是没搞懂。。。[Quote=引用 6 楼 的回复:]

就是用datetime.strptime(date_string, format) 这个函数把字串形式的时间数据转化成datetime对象。两个datetime对象相减就是timedelta对象,timedelta本身支持4则运算符号,你想统计算出百分比简单写+-*/即可,自己练练吧...
[/Quote]

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧