遇到一個需求是要把文檔中的三層文件夾結構變成兩層,想着之間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(),這個函數的意思是將從文件指針所指的位置開始至文件末尾的內容刪除。所以清空文件的話要保證seek(0,0)