一、f.seek的应用
"""
模仿:linux中的tail -f命令
动态查看程序的变化,动态检测access.log的末尾,有没有追加新的内容,有显示到屏幕上。
分析:
1、你需要有追加写日志数据的程序
2、你需要有检测当日志数据新增了以后,打印到屏幕上的程序
补充:seek的三种模式,在没有移动文件指针的情况下,都可以使用
"""
# 创建一个文件用来存放追加写日志数据的代码
with open('access.log', mode='at', encoding='utf-8') as f:
import datetime
f.write(f'日志:{datetime.datetime.now()}'.center(50, '-') + '\n')
# 创建另一个文件用来存放当日志数据新增了以后,打印到屏幕上的代码
import time
with open('access.log', 'rb') as f: # 注意:只要涉及到文件指针的操作,最好使用b模式操作。
f.seek(0, 2) # 2模式下,让光标停留在末尾。
while True:
res = f.readline()
if len(res):
print(res.decode('utf-8')) # b模式下读文件,需要decode
else:
time.sleep(2) # 定时2秒检测一次。
二、文件修改的两种方式
1、前提:对于硬盘上的数据的修改,没有改的操作,只有覆盖的操作。
"""
引入:你平时争对文件的修改,都是在内存中的修改。改完了以后,点击保存。这是你修改以后的当前所有内容会覆盖回写硬盘中。所以说所有的编辑器的修改都是覆盖行为。
"""
'''
# 文件a.txt内容如下:
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
'''
with open('a.txt', mode='r+', encoding='utf-8') as f:
# f.seek(9, 0)
f.seek(9) # seek模式就是0模式,第二个参数可以不指定
f.write('<男妇女主任>')
'''
# 文件a.txt内容修改以后:
张一蛋<男妇女主任>9 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
'''
2、文件修改方式一
"""
实现思路:将文件内容一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
优点:在文件修改的过程中同一份数据只有一份。
缺点:过多的占用内存。
我们来讨论,什么时候才是正真的占用内存空间呢?是执行open操作时吗?是执行f.read()操作时吗?
解释:open打开文件的时候,只是一种发送系统调用的请求。正真修改内容是在指定f.write操作之后。
使用场景:文本编辑器(注重对用户的体验)
""""
# 1、错误示范:如果同时操作同一份文件,r读取文件、w打开文件,w会在一打开的时候就会清空该文件,这个时候,还没有进行读、写操作,原文件中的内容就没了。
'''
# 文件a.txt内容如下:
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
'''
with open('a.txt', mode='rt', encoding='utf-8') as f1, \
open('a.txt', mode='wt', encoding='utf-8') as f2:
pass
# 2、实现修改文件操作
# 需求:将所有dsb修改成alex
'''
# 文件c.txt内容如下:
dsb is sb
sb is dsb
egon is hahahahah
'''
with open('c.txt', mode='rt', encoding='utf-8') as f:
res = f.read()
data = res.replace('dsb', 'alex')
print(data)
with open('c.txt', mode='wt', encoding='utf-8') as f:
f.write(data)
'''
# 文件c.txt内容修改以后:
alex is sb
sb is alex
egon is hahahahah
'''
3、文件修改方式二
"""
实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行一行读取原文件内容,修改完后写入临时文件。。。,删掉原文件,将新文件重名名为原文件名。。
优点:耗费2倍硬盘空间。
缺点:节省内存空间,加载在内存中的数据,仅仅是文件的一行内容。
使用场景:开发程序时的修改文件
"""
# 需求:将所有dsb修改成alex
'''
# 文件c.txt内容如下:
dsb is sb
sb is dsb
egon is hahahahah
'''
import os
with open('c.txt', mode='rt', encoding='utf-8') as f1, \
open('.c.txt.swap', mode='wt', encoding='utf-8') as f2:
for line in f1:
data = line.replace('dsb', 'alex')
f2.write(data)
os.remove('c.txt')
os.rename('.c.txt.swap', 'c.txt')
'''
# 文件c.txt内容修改以后:
alex is sb
sb is alex
egon is hahahahah
'''