python生成器-管道学习(二)

2019-07-13  本文已影响0人  frankie_cheung

part2

处理数据流:
需求:计算服务器请求日志里面,所有日志的请求字节总数量:
示例:

image.png
1.每一行最后的数据就是字节数,
需要注意的是:
每一行日志是这样的:
81.107.39.38 - ... "GET /ply/ply.html HTTP/1.1" 200 97238
2.获取到每一行的最后一个数值:
bytes_sent = line.rsplit(None,1)[1]
3.有时候最后一行没有数据 是‘_’:
81.107.39.38 - ... "GET /ply/ HTTP/1.1" 304 -
4.你需要把获取到的字节数由字符串转为int,否则你没法计算总字节数。
if bytes_sent != '-':
   bytes_sent = int(bytes_sent)

传统的for循环 你是这样处理的:

with open("access-log") as wwwlog:
   total = 0
   for line in wwwlog:
     bytes_sent = line.rsplit(None,1)[1]
     if bytes_sent != '-':
       total += int(bytes_sent)
 print("Total", total)

循环每一行,找到最后的字节数,把字节数转为int,然后累加。
大佬不屑于使用这样的方法,生成器版本是这样的:

with open("access-log") as wwwlog:
   bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
   bytes_sent = (int(x) for x in bytecolumn if x != '-')
   print("Total", sum(bytes_sent))

1.bytecolumn:使用列表推导式直接变成一个生成器,条件判断写里面代码简洁。
2.bytes_sent for循环bytecolumn 这个生成器,直接也在里面写条件判断,
3.sum对生成器做一个求和。
总结:sum函数是驱动整个生成器一直向下循环的起点,两个生成器就和管道一样,一直源源不断的传输数据,直到数据求和完毕。
盗图:


image.png

这个很形象的以管道的形式展示了这种大佬的处理思想;据说还很快。。。

上一篇 下一篇

猜你喜欢

热点阅读