zoukankan      html  css  js  c++  java
  • 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秒之后再读
  • 相关阅读:
    Lintcode: Wood Cut
    Lintcode: Update Bits
    Lintcode: Route Between Two Nodes in Graph
    Lintcode: Flip Bits
    Leetcode: Maximum Size Subarray Sum Equals k
    Lintcode: Subarray Sum Closest
    Lintcode: Remove Node in Binary Search Tree
    Lintcode: Majority Number III
    Leetcode: Range Sum Query
    Leetcode: Create Maximum Number
  • 原文地址:https://www.cnblogs.com/once-again/p/9573936.html
Copyright © 2011-2022 走看看