遇到一个需求是要把文档中的三层文件夹结构变成两层,想着之间replace('..\\..\\..\\', '..\\..\\')就行了,然后读取文件的时候用'r+'模式,这样就可以覆盖读,还不用多弄出一个文件来,美滋滋。可是还是遇到了问题。
简化的代码如下
with open('D:\\demo.txt','r+', 777, 'utf-8') as f1:
infos = f1.readlines()
f1.seek(0,0)
for line in infos:
line_new = line.replace('FF','a')
f1.write(line_new)
其中demo.txt的内容是:FFFF
上面代码运行结束后文件中的内容变成了:aaFF。然后就想为啥会还保留着两个FF??
理解一下seek就明白了,这个东西不管是进行f.write还是进行f.read,都会改变文件指针的位置,因为那些函数都是基于文件指针来得到其中的值的。所以当我们f.write('aa')之后,文件的位置也只是移动了两个地方,并没有改变后面位置的内容。
解决方法:使用文件截断函数truncate(n),如果n没有值,这个函数的意思是将从文件指针所指的位置开始至文件末尾的内容删除。如果n有值(假设为3),则将第三个字符开始到末尾的部分删除。