• Python(六)操作文件+非空即真


    文件的基本操作

    r:只读(默认),不能写,在打开文件时,r可以省略不写,打开不存在的文件会报错

    w:只写模式,不可读:不存在的文件则会创建,存在的文件会清空文件内容

    a:追加模式,不可读:不存在的文件会创建,存在的文件会追加

    r+:可读,可写,。打开不存在的文件会报错

    w+:读写模式,已经存在的文件,内容会被清空,可以读到已经写得内容

    a+:追加读写模式,不存在则创建,存在则只追加内容

    文件的操作方法

    readlines():读取文件所有内容,把每行的内容放到一个list里面

    readline():读取文件里面第一行的内容

    read():读取文件的所有内容

    seek():文件指针

    1、当前文件指针指到哪,seek(0):指到文件的最前面

    2、read与readlines文件指针到文件的最后一行;readline文件指针到第二行

    write():写入内容,传的内容必须得是字符串

    flush():写入文件后,刷新缓冲区,立即写到磁盘上.例如f.write()文件没有写入成功,那就就要用.flush方法,文件就会更新,即写入成功了

    tell():获取当前文件的指针指向

    truncate():清空文件内容

    writelines():会循环list里面的每一个元素都写进文件里面去

    高效读取文件

    思路:直接循环文件对象,每次取得的就是文件里的每一行,直接使用for循环即可

    with使用方法

    with:会在使用完这个文件之后,自动关闭文件,用法如下:

    修改文件

    修改文件的话,有两种方式,一种是把文件的全部内容都读到内存中,然后把原有的文件内容清空,重新写新的内容;第二种是把修改后的文件内容写到一个新的文件中

    第一种:

    第二种:

     非空即真、非0即真

    TRUE:真

    false:'' none,[],{}

    非空即真:

    非0即真:

     练习:

    #-*-coding:utf-8-*-
    #需求:每分钟监控服务器日志,IP请求超过200次的,加入黑名单
    #
    #1、读文件,获取到每行的内容,open readlines
    # 178.210.90.90 - - [04/Jun/2017:03:44:13 +0800]
    #2、找到IP,按照空格分隔字符串,取第一个元素,split
    # 3、把IP存到字典里,每个IP出现一次,IP次数就+1
    # 4、判断IP次数是否大于200,加入黑明单
    import time
    point=0#定义一个指针为0,即在文件的最上边
    while True:#循环
    ips={}#定义一个空字典
    f=open('access.log',encoding='utf-8')
    f.seek(point)#指定到指针的位置
    for line in f.readlines():#循环文件里的每一行,即生成list
    #获取所有的IP和次数存在字典里
    ip=line.split()[0]#list里面按照空格分隔字符串,第一个元素即为ip,存在变量ip里面
    #print(ip)
    if ip not in ips:#
    ips[ip]=1#如果从list里面取到的ip不在字典ips里面,那么这个ip对应的value=1
    else:
    ips[ip]+=1#如果从list里面取到的ip在字典ips里面,那么这个ip对应的value的值就+1
    point=f.tell()#记录读完之后的文件指针
    for k,count in ips.items():
    if count>200:
    print('[%s]加入黑明单 '%ip)
    #print(ips)
    time.sleep(60)

    修改文件:
    文件内容如下:

    #-*-coding:utf-8-*-
    # 把文件里面没有交作业的人名字后面加上‘没有交’
    # 已经交作业的加上‘交了’
    # 1、读文件
    # 2、按照空格分隔每个人的作业信息
    import os
    with open('stu.txt',encoding='utf-8')as fr,open('.new_stu','w',encoding='utf-8')as fw:#打开两个文件
    for line in fr:#在fr里面循环取每一行的数据
    line_list=line.split()#按照空格分隔字符串,生成list
    if len(line_list)>1:
    line_list[-1]='已交 '
    else:
    line_list.append('未交 ')
    fw.writelines(line_list)
    os.remove('stu.txt')
    os.rename('.new_stu','stu.txt')
    
    


  • 相关阅读:
    根据访问ip的地区跳转到指定地址
    js生成vCard,以及格式参数详细说明
    min_to_split_multiprocessing多进程,用于平时快速补充数据
    min_to_split.py按日存储到按个股存储
    readzip_minute_data 多进程处理数据
    打包成7zfile,to7zfile
    baostock_multiprocessing 多进程取数据
    终止阻塞线程(有共享锁的线程无效)
    readzip_add_maxL3多线程
    readzip_add_maxL2
  • 原文地址:https://www.cnblogs.com/qiaomeiling/p/9984517.html
Copyright © 2020-2023  润新知