文件处理/光标移动/实时检测

一.打开文件的其他方式

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给文件

原文地址:https://www.cnblogs.com/z929chongzi/p/11152019.html