文件处理/光标移动/实时检测
一.打开文件的其他方式
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个亿的工资\n'%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给文件