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