文件内指针操作(掌握):
f.seek:
第一个参数:控制移动的字节数
第二个参数:控制移动的参照物,值可以为0、1、2
0:参照文件开头(在b和t模式都能用)
强调:除了0模式以外模式都只能在b模式下使用,即1和2模式只能用在b模式下
with open('e.txt',mode='rt',encoding='utf-8') as f: # f.seek(6,0) # 单位是字节 # print(f.read()) f.read() f.seek(0,0) print('第二次',f.read())
1: 参照当前位置(只能在b模式下用)
储备:read(n)
read的n在t模式下代表的是字符个数
read的n在b模式下代表的是字节个数
其余所有文件内指针的移动都是以字节为单位
with open('e.txt',mode='rt',encoding='utf-8') as f: data=f.read(2) print(data) with open('e.txt',mode='rb') as f: data=f.read(3) print(data.decode('utf-8')) with open('e.txt',mode='rb') as f: s=f.read(3) # 指针在第3个bytes # print(s) # print(f.tell()) # f.seek(6,0) f.seek(3,1) print(f.read())
2:参照文件末尾(只能在b模式下用)
with open('e.txt',mode='rb') as f: f.seek(-6,2) print(f.read()) with open('e.txt','r+t',encoding='utf-8') as f: f.truncate(9) # 从文件开头截取到3bytes的位置,其余的删除
修改文件
文本编辑器修改文件的原理:
1、先将文件内容全部读入内存
2、在内存中修改完毕
3、将修改的结果覆盖写回硬盘
优点:在修改期间硬盘上同一时刻只有一份数据
缺点:占用内存过高
with open('db.txt',mode='rt',encoding='utf-8') as f: data=f.read() new_data=data.replace('alex','alexdsb') print(new_data) with open('db.txt',mode='wt',encoding='utf-8') as f: f.write(new_data)
一行一行的读,一行一行的改:
1、以读的模式打开源文件,以写的模式打开一个临时文件
2、然后用for循环读取原文件一行行内容,每读一行则修改一行,将修改的结果写入临时文件,直到把源文件都遍历完
3、删除原文件,将临时文件重命名为原文件名
优点:同一时刻在内存中只存在文件的一行内容
缺点:在修改期间硬盘上同一份数据会保存两份
import os with open('db.txt',mode='rt',encoding='utf-8') as src_f, open('.db.txt.swap',mode='wt',encoding='utf-8') as temp_f: for line in src_f: if 'alex' in line: line=line.replace('alex','alexdsb') temp_f.write(line) os.remove('db.txt') os.rename('.db.txt.swap','db.txt')