day4_高效处理文件

read()将文件内容从磁盘中全部读出,放到内存,再给cpu处理,性能低,如果文件量大,很容易内存溢出或卡死。

高效方式:

方式一:一般不用的,代码行多

f = open('users.txt','r',encoding='utf-8')  #打开文件
#第一种方式:
while True:  #写个死循环,知道空字符串停止循环,也就是没有内容了(文件中空行也是有东西的,不代表是空字符串)
    line = f.readline()   #line每次循环,都被替换,这个方法性能高
    if line!='':
        print('line',line)
    else:
        print('文件内容都读完了,结束了')
        break

方式二:

# 第二种方式:
for line in f:   #把文件里的每一行都读到
    print(line)

练习题:

#1、要从日志里面找到1分钟之内访问超过200次的
#2、每分钟都运行一次

# 1、读取文件内容,获取到ip地址
# 2、把每个ip地址存起来 {}
# 3、判断ip访问的次数是否超过200次
# 4、加入黑名单 print

import time
point = 0  #初始的位置,不能定义到循环里面
while True:
    f = open('access.log', encoding='utf-8')
    ip_dict = {}  # 这个不要放在外面,不然字典内容特别大
    f.seek(point)
    for line in f:           #循环取文件里面每行数据
        ip = line.split()[0]  #按照空格分割,取第一个元素就ip
        if ip in ip_dict:     #判断这个ip是否存在,如果存在,则value值+1
            ip_dict[ip] += 1  #如果存在的话,次数加+1
        else:
            ip_dict[ip] = 1   #如果第一次遇见的ip,则value值就是1
    point = f.tell()         #记录文件指针位置
    f.close()
    for ip,ipcount in ip_dict.items():#循环这个字典,判断次数大于200的
        if ipcount > 200:
            print('%s 加入黑名单'%ip)
    time.sleep(60)#定时运行 60秒之后再读

猜你喜欢

转载自www.cnblogs.com/once-again/p/9573936.html
今日推荐