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秒之后再读