python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...
本文主要討論一下文件的三種可讀可寫模式的特點及互相之間的區(qū)別,以及能否實現(xiàn)修改文件的操作
由于前文已經(jīng)討論過編碼的事情了,所以這里不再研究編碼,所有打開操作默認都是utf-8編碼(Linux系統(tǒng)下)
首先我們看r+(讀寫)
既然r+既能讀又能寫,那么能否實現(xiàn)在r+模式下進行文件的修改呢?答案是肯定的!,但是,有一點你需要注意,除非你知道在確切的位置修改確切的內容,否則往往不會得到你期望的結果。舉個例子如下:
我們有這樣一個文本“十步殺一人,千里不留行”
假設有這樣一個需求,把“十步殺一人”改成“十步殺一個土匪”,初步設想是:用read(4)讀取到漢字“一”,然后寫入漢字“個土匪”:
with open('job', mode='r+') as f:
print('先讀取四個字符:',f.read(4))
print('讀取后的指針位置:',f.tell())
f.write('個土匪')
f.seek(0)
print(f.read())
輸出為:
先讀取四個字符: 十步殺一
讀取后的指針位置: 12
十步殺一人,千里不留行個土匪
從結果可以看到,使用read(4)指針確實移動到了指定的位置,但是寫入的時候卻沒有按照設想,而是跑到了文件的末尾。這個原因涉及到一個叫“CHUNK”的東西,俺滴老師沒教,我也不好深說,等深入理解它后再和你們講哈😅😅😅
那么我們只說解決辦法,可以用seek()手動定位指針,讓它處在12的位置,然后再寫入:
with open('job', mode='r+') as f:
print('先讀取四個字符:',f.read(4))
print('讀取后的指針位置:',f.tell())
f.seek(f.tell())
f.write('個土匪')
f.seek(0)
print(f.read())
輸出:
先讀取四個字符: 十步殺一
讀取后的指針位置: 12
十步殺一個土匪里不留行
從結果可以看出,它確實是把人字改成了“個土匪”,可是它卻把后面的字給覆蓋了,這完全不是我們想要的結果,那么為什么呢?
原因就是:當文件寫入磁盤后,磁盤會分出一塊空間(實際上應該叫多個存儲元的集合,具體請參考我另外一篇文章),這塊空間是固定的,當你定位指針修改已經(jīng)存在的內容時,相鄰的后面的內容并不會給你要寫入的內容“讓地方”,也就是說你可以對它進行覆蓋操作,但是你不能讓后面的內容挪地方(這么說直白不?應該能明白吧。), 因此,雖然我們想要修改的是人這個字,但是由于你寫入了“個土匪”三個字,所以后面的內容被覆蓋了,變成了“十步殺一個土匪里不留行”。
接下來我們看看w+(寫讀模式)
w+,也就是寫讀操作,仍然對文件libai2操作,需求還是上例的需求
with open('libai2','w+') as f:
content = f.read(25)#讀取25個字符,這其中包括24個中文漢字或符號 和 一個換行符
print('讀取操作后的指針位置:',f.tell())#指針處在0,那么意味著文件內容是空的
f.write('五')#然后我們寫入中文漢字:“五”,期待能覆蓋掉原來的“十”
print('寫入操作后的指針位置:',f.tell())#結果發(fā)現(xiàn)指針在3字節(jié)的位置,也就是一個漢字五的后面
f.seek(0)
print(f.read())
讀取操作后的指針位置: 0
寫入操作后的指針位置: 3
五
我們可以看到整個文件的內容消失了,只有一個漢字“五”
這是因為w開頭的模式會先進行判斷,如果文件已存在則打開文件,并且清空文件內容。如果該文件不存在,則創(chuàng)建新文件。
所以當使用w+這種模式打開文件的那一刻,這個文件原本的內容就已經(jīng)消失了。
最后我們看看a+(追加寫讀模式)
我們在后臺從新創(chuàng)建了一個libai3文件,里面還是只包含那兩句詩
with open('libai3','a+') as f:
print('初始指針位置',f.tell())
#初始指針位置是146,48個漢字或字符 加2個換行符,48*3+2=146
#由此可以看出,初始文件指針處在文件末尾位置
f.seek(73) #我們把指針調整到73字節(jié)的位置,也就是漢字“十”的前面
print('調整指針在73字節(jié)的位置:',f.tell())
f.write('五')#然后我們寫入漢字“五”
f.seek(0) #調整指針到文件頭部位置
print(f.read()) #輸出文件看看發(fā)生了什么
初始指針位置 146
調整指針在73字節(jié)的位置: 73
趙客縵胡纓,吳鉤霜雪明。銀鞍照白馬,颯沓如流星。
十步殺一人,千里不留行。事了拂衣去,深藏身與名。
五
我們發(fā)現(xiàn)漢字“五”還是被寫在了文件末尾
總結
w+和a+無法完成文件的修改操作,r+可以實現(xiàn)修改的操作,但是結果往往和我們預期的不太一樣,當然,除非你知道要把確切的內容換成確切的新內容,不過感覺這個應用價值不大吧?
總結
以上是生活随笔為你收集整理的python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下数据库可视化软件推荐
- 下一篇: Python 内置模块之 re