-
文件内光标的移动
-
使用seek方法:其格式为seek(offset,whence),其中offset是相对偏移量的意思
- whence有 三种情况:
-
-
-
- 0是参照文件开头,在t和b模式下都能使用
- 1是参考文件光标位置,只能在b模式下使用(值得注意的是,参照光标的位置意义在于之前的代码以及将光标从开头移动到了其他位置,如果一开始就只用这个,只能从文件开头的内容开始移动)
- 2是参考文件的末尾,只能在b模式下使用
-
-
- 上述三种模式,无论在哪种模式运行,seek移动都是以字节(bytes)的单位进行移动的。而read对于文本文件模式是以字符个数为单位读取的,对于二进制数据则还是字节为单位。
-
with open(r'test01.txt','rb') as f1,open(r'test01.txt','rb') as f2: f1.seek(9,0) # 是从文件的开头开始,相对于开头做9个字节即三个中文汉字的移动 res = f1.read(3) # 从第9个字节的光标处读之后的3个字节的二进制数据 print(res.decode('utf-8')) # 将二进制数据以utf-8的格式进行解码,输出‘世’ f1.seek(0,1) # 从上面读完3个字节的数据后的光标开始 print(f1.read(3).decode('utf-8')) 输出‘界’ f2.seek(-9,2) # 从文本内容的最后往前面9个字节的内容开始光标 print(f2.read(6).decode('utf-8')) # 从上述光标的开始处读取6个字节的二进制数据并解码,输出‘员’
# 其中文件的内容是梅西是世界上最好的球员 -
截断文件内容
-
with open(r'G:\老男孩\7.2-If while for语句的使用\代码\day04\da.txt','r+',encoding='utf-8') as f: print(f.read()) f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
# 其中da.txt中的内容是梅西是世界上最好的足球运动员,结果输出为‘梅西’ -
修改文件内容
-
with open(r'G:\老男孩\7.2-If while for语句的使用\代码\day04\test01.txt','r',encoding = 'utf-8') as f1: data = f1.read() # 将文件中的内容读到内存 with open(r'G:\老男孩\7.2-If while for语句的使用\代码\day04\test01.txt','w',encoding = 'utf-8') as f1: data2 = data.replace('梅西','C罗') # 将内容在内存中修改 print(data2) f1.write(data2) # 将修改后的内容重新读取到源文件
# 优点:不会硬盘中出现两个及以上的文件来占据硬盘空间
缺点:假如文件内容过大则会导致内存的溢出· -
with open(r'G:\老男孩\7.2-If while for语句的使用\代码\day04\test01.txt','r',encoding = 'utf-8') as f1,\ open(r'G:\老男孩\7.2-If while for语句的使用\代码\day04\test06.txt','a',encoding ='utf-8') as f2: res = f1.readlines() print(res) for data2 in f1: # 将文件句柄放入循环语句相当于对其的readlines输出的列表进行循环 data3 = data2.replace('C罗','梅西') # 进行替换,前面是原数据后面是将要将其替换的数据 f2.write(data3)
# 优点:每一次只将一组数据读到内存中,不会占用太多内存
缺点:会存有两组文件在硬盘上,占用硬盘空间