zoukankan      html  css  js  c++  java
  • 文件处理/光标移动/实时检测

    一.打开文件的其他方式

    1.r+

    with open(r'test',mode='r+',encoding='utf-8') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        print(f.readline())
        f.write('嘿嘿嘿')

    2.w+

    with open(r'test',mode='w+',encoding='utf-8') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        print(f.readline())
        f.write('嘿嘿嘿')

    3.a+

    with open(r'test',mode='+',encoding='utf-8') as f:
        print(f.readable())  # True
        print(f.writable())  # True
        print(f.readline())
        f.write('啊哈哈')

    二.文件内光标的移动

    1.在rt模式下,read内的数字表示移动的字符个数

    with open(r'test','r',encoding='utf-8') as f:
        print(f.read(5))  # 读前五个字符
    with open(r'test','rb') as f:
        res = f.read(6)  # 读的是六个字节(6bytes)
        print(res)

    2.光标移动的基本语句

    f.seek(offset,whence)

    offset:相对偏移量  光标移动的位数

    whence:

    0:t和b模式下都能使用  参照文件的开头

    1.只能在b模式下使用  参照光标当前的位置

    2.只能在b模式下使用  参照文件末尾

    with open(r'test','rt',encoding='utf-8') as f:
        print(f.read(1))  # 移动一个字符
        # f.seek(6,0)  # seek移动都是字节数
        # f.seek(4,0)  # seek移动都是字节数
        # print(f.read(1))
        f.seek(0,0)  # 移动到文件开头
        print(f.read(1))
        f.seek(6,0)  # 以文件开头为参照移动6字节
        print(f.read())
    with open(r'test','rb') as f:
        print(f.read())  # 读取文件光标移至文件末尾
        f.seek(-4,2)  # 以文件末尾为参照 向前移动四个字节
        print(f.read().decode('utf-8'))  # 读取光标后的文件内容(4字节)把文件 
                                                     #内容由utf-8格式解码成unicode码
    with open(r'test','rb') as f:
        print(f.read(3).decode('utf-8'))  # 将读取的3个字节的二进制文件转化成unicode格式进行解码
        f.seek(3,1)  # 以光标当前位置为参照向后移动三个字节
        print(f.read(1))  # 读取一个字节
        f.seek(6,0)  # seek移动6字节数
        f.seek(4,0)  # seek移动4字节数

    三.实时检测

    1.将抓取的日志写入日志文件

    2.将光标移至文件的末尾,读取文件内容,若果读取内容不为空,则日志文件被写入新内容,输出新内容。若读取内容为空则接着读取判(本步骤不停的循环)

    写日志文件:

    import time
    res = time.strftime('%Y-%m-%d %X')
    with open(r'test01.txt','a',encoding='utf-8') as f:  # 以a模式打开文件若不再存在会新建一个,新加入的日志只会在文件的末尾
        f.write('%s egon给jason发了1个亿的工资
    '%res)  # 将新日志写入文件

    检测文件

    with open(r'test01.txr','rb',encoding='utf-8') as f:  # 以rb模式打开文件
        f.seek(0,2)  # 在b模式下将光标一直文件末尾
        while True:
            res = f.read()  # 读取光标后文件内容
            if res:  # 对读取的内容进行判断
                print(res.decode('utf-8'))  # 将读取的内容由utf-8格式转成 
                                                      #unicode格式

    四.截断文件

    truncate:截断

    with open(r'test','a',encoding='utf-8') as f:
        f.truncate(6)  # 接收的字节的长度 整型
        # 保留0~6字节数 后面的全部删除(截断)

    五.修改文件

    方式一:

    1.先将文件读入到内存(读文件)

    2.在内存中完成文件的修改(字符串替换)

    3.覆盖原文件(写文件)

    with open(r'test02.txt','r',encoding='utf-8') as f:  # 以r模式打开文件
        data = f.read()  # 读取文件内容
    with open(r'test02.txt','w',encoding='utf-8') as f:  # 以w模式打开文件(文件内容会被清空)
        res = data.replace('old','new')  # 修改文件内容(字符串的替换)
        f.write(res)  # 写文件

    优点:任意时间上硬盘只有一个文件,不会占用过多的硬盘资源

    缺点:当文件过大的情况下会造成内存溢出

    方式二:

    1.打开要被修改的文件,新建一个临时文件

    2.循环读取(一行行读取用for循环)文件内容,并进行修改,修改完成后写道临时文件中

    3.将老文件删除,对新文件进行重命名

    import os
    with open(r'test02.txt','r',encoding='utf-8') as read_f,
            open(r'test02.swap','a',encoding='utf-8') as write_f:  # 以r模式打开目标文件以a模式打开(新建)临时文件
        for line in read_f:  # 对目标文件进行循环(每次只读取一行内容)
            new_line = line.replace('old','new')  # 对读取的内容进行修改
            write_f.write(new_line)  # 将修改i完成后的内容添加进临时文件(只会添加在文件最后)
    os.remove('test02.txt')  # 移除老文件
    os.rename('test02.swap','test02.txt')  # 对临时文件进行重命名

    优点:内存中始终只有一行内容,不占内存

    缺点:早某一时间内存中会存在2给文件

  • 相关阅读:
    白盒测试方法
    单元测试 集成测试 系统测试
    快慢指针原理和应用
    实例方法,类方法,静态方法区别
    查找算法
    排序算法整理
    Oracle sql developer 删表时遇到问题unique/primary keys in table referenced by foreign keys
    剑指 Offer 18. 删除链表的节点(简单)
    剑指 Offer 17. 打印从1到最大的n位数(简单)
    Cyberdebut的补题列表
  • 原文地址:https://www.cnblogs.com/z929chongzi/p/11152019.html
Copyright © 2011-2022 走看看