大前提:文件内指针的移动是Bytes为单位的,唯独t模式下的read读取内容是以字符为单位的
一、read(3):
1,。文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二、其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1.seek有三种移动方式0 ,1 ,2,其中1,2必须在b模式下进行,但无论哪种模,都是以bytes为单位移动的
2.truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或者a+等模式下测试效果
模式控制:
0:默认的模式,该模式指针代表指针移动的字节数是以文件开头为参照的
1:该模式代表指针移动的字节数是以当前所在位置为参照的
2,:该模式代表指针移动的字节数是以文件末尾的位置来参照的
#强调:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
#f.tell()查看文件指针当前距离文件开头的位置
#with open('a.txt',mode='rt',encoding='utf-8')as f:
# f.seek(4.0)
# print(f.tell)
# print(f.read)
with open ('a.txt',mode='rb') as f
f.seek(4,0)
print(f.tell())
print(f.read().decode('utf-8')
文件的修改:
文件的数据是存放在于硬盘上,因而只存在覆盖,不存在修改一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,在由内存覆盖到硬盘(word,vim,nodpadd++等编辑器)
import os
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改write_f.write(data) #一次性写入新文件
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')方式二:
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕 就写入新文件,最后用新文件覆盖原文件
import os
with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
for line in read_f: line=line.replace('alex','SB') write_f.write(line)os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')