设为首页 收藏本站
查看: 759|回复: 0

[经验分享] Python第七周 学习笔记(1)

[复制链接]

尚未签到

发表于 2018-8-13 08:39:54 | 显示全部楼层 |阅读模式
import re  from pathlib import Path
  import datetime
  import time
  import threading
  from queue import Queue
  from user_agents import parse
  PATTERN = r'''(?P<ip>[\d.]{7,})\s-\s-\s\[(?P<datetime>[^\[\]]+)\]\s"(?P<method>[^"\s]+)\s(?P<url>[^"\s]+)\s(?P<protocol>[^"\s]+)"\s(?P<status>\d{3})\s(?P<size>\d+)\s"(?:.+)"\s"(?P<useragent>[^"]+)"'''
  pattern = re.compile(PATTERN)
  def extract(text):
  ops = {'datetime': (lambda x: datetime.datetime.strptime(x, '%d/%b/%Y:%H:%M:%S %z')), 'status': int, 'size': int,
  'useragent': lambda x: parse(x)}
  mat = pattern.match(text)
  return {k: ops.get(k, lambda x: x)(v) for k, v in mat.groupdict().items()}
  def openfile(filename):
  with open(filename) as f:
  for text in f:
  fields = extract(text)
  time.sleep(2)
  if fields:
  yield fields
  else:
  continue
  # producer
  def load(*pathnames):
  for path in pathnames:
  pathname = Path(path)
  if not pathname.exists():
  continue
  if pathname.is_file():
  yield from openfile(pathname)
  elif pathname.is_dir():
  for filename in pathname.iterdir():
  if filename.is_file():
  yield from openfile(filename)
  def sum_size_handler(iterable):
  return sum(map(lambda x: x['size'], iterable))
  def status_handler(iterable):
  status = {}
  for dic in iterable:
  key = dic['status']
  status[key] = status.get(key, 0) + 1
  return {k: v / len(iterable) for k, v in status.items()}
  d = {}
  def ua_handler(iterable):
  ua_family = {}
  for item in iterable:
  val = item['useragent']
  key = (val.browser.family, val.browser.version_string)
  ua_family[key] = ua_family.get(key, 0) + 1
  d[key] = d.get(key, 0) + 1
  return ua_family, d
  # consumer

  def window(q: Queue, handler,>  st_time = datetime.datetime.strptime('19700101 000000 +0800', '%Y%m%d %H%M%S %z')
  cur_time = datetime.datetime.strptime('19700101 010000 +0800', '%Y%m%d %H%M%S %z')
  buffer = []
  while True:
  # src = next(iterable)
  src = q.get()
  print(src)
  buffer.append(src)
  cur_time = src['datetime']
  if (cur_time - st_time).total_seconds() > interval:
  val = handler(buffer)
  st_time = cur_time
  b, d = val
  d = sorted(d.items(), key=lambda x: x[1], reverse=True)
  print(val)
  print(d)
  buffer = [x for x in buffer if x['datetime'] > (cur_time - datetime.timedelta(seconds=width - interval))]
  def dispatcher(src):
  reg_handler = []
  queues = []

  def reg(handler,>  q = Queue()
  queues.append(q)

  thrd = threading.Thread(target=window, args=(q, handler,>  reg_handler.append(thrd)
  def run():
  for i in reg_handler:
  i.start()
  for item in src:
  for q in queues:
  q.put(item)
  return reg, run
  if __name__ == '__main__':
  import sys
  # path=sys.argv[1]
  path = 'test.log'
  reg, run = dispatcher(load('test.log'))
  # reg(sum_size_handler, 20, 5)
  # reg(status_handler, 20, 5)
  reg(ua_handler, 20, 5)
  run()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550933-1-1.html 上篇帖子: python regex-cooperfang的博客 下篇帖子: python的运算
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表