当文件内容中间需要增加内容时,单纯的使用w和a模式已无法实现,所以我们需要对文件内的光标进行移动
>>>硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容。<<<
光标移动常用方法
seek(offset,whence)
-
offset 代表文件指针的偏移量,单位是字节,
-
whence 代表光标的位置,
0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
# test02.txt # >>>>>> #tian是天上的云 #tian是天上的云 #tian是天上的云 # >>>>>>
with open(r'test02.txt','r',encoding='utf-8') as f: print(f.read(5)) #tian是
# 在rt模式下 read内的数字 表示的是字符的个数
# 除此之外,数字表示的都是字节
只有在r模式下才可以进行游标操作(游标操作的是字节) with open('a.txt','rb') as rb: date = rb.read(10) f.seek(2,0) #seek(offset,whence) offset 前面的是游标移动的字节数,正数表示向后移动,负号表示向前移动。 逗号后面的数字在b模式下可以为0、1、2 whence 0:游标置到开头 1:游标置到当前位指 2:游标置到末尾 # 你是日本人 with open('target.txt', 'rb') as f: # 先读6个字节 data = f.read(6) print(data.decode('utf-8')) # 你是 # 将游标从头开始往后偏移3个字节 f.seek(3, 0) data = f.read(6) print(data.decode('utf-8')) # 是日 # 从当前游标位置往前偏移3个字节 f.seek(-3, 1) data = f.read(3) print(data.decode('utf-8')) # 日 f.seek(-3, 2) data = f.read(3) print(data.decode('utf-8')) # 人
检测文件内容
检测文件是否被修改
打开文件 利用f.seek(0,2)将光标移动到文件末尾
利用while循环
再利用readline()来读取末尾内容
在通过if判断看readline()是否有值,有值说明文件新增了内容
通过字符串的格式化输出将新增的文件内容输出给检测程序
查看当前光标移动了多少字节
with open(r'a.txt','rb') as f: # 先将光标移动到文件末尾 f.seek(0,2) while True: res = f.readline() # 查看光标移动了多少位 bytes # print(f.tell()) if res: print("新增的文件内容:%s"%res.decode('utf-8')) # 说明有人操作当前文件 # else: # # 说明文件没有被任何人操作 # print('暂无其他人操作该文件')
截断文件内容
截断文件内容
f.truncate() 括号内输入的数字 表示的是字节数
将内存中的文件内容直接刷到硬盘
f.flush()
with open(r'a.txt','a',encoding = 'utf-8') as f: f.truncate(3) # 接收字节的长度,必须为整型 #保留0~3的字节数,后面的全部删除
修改文件的两种方式
# 第一种方式: # 先将数据由硬盘读到内存(读文件) # 在内存中完成修改(字符串的替换) # 再覆盖原来的内容(写文件) 复制代码 with open(r'a.txt','r',encoding='utf-8') as f: data = f.read() print(data) # 读取该文件 with open(r'a.txt','w',encoding='utf-8') as f: res = data.replace('egon','jason') # 将该文件里指定的内容进行替换 f.write(res) # 将修改的内容写入 复制代码 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间 缺点:当文件过大的情况下,可能会造成内存溢出
# 第二种方式: # 创建一个新文件 # 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中 # 将老文件删除 将新文件的名字改成老文件名 复制代码 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: for line in read_f: # 取read_f 中的文件 new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('testt02.txt') # 移除该文件 os.rename('test02.swap','test02.txt') # 重新命名 复制代码 优点:内存中始终只有一行内容 不占内存 缺点:再某一时刻硬盘上会同时存在两个文件