【Python小筆記】讀寫模式w+、r+、a+實例對比

一、w+模式:在w模式的基礎上增長可讀功能。

可讀可寫模式打開文本,文件不存在時新建,文件有內容時以寫入的內容覆蓋。python

a.寫入內容
with open('write_plus.txt','w+') as f:
    f.write('hi,I am write plus1')

相應目錄下生成’write_plus.txt’
文檔內容:
hi,I am write plus1web

b.內容覆蓋
with open('write_plus.txt','w+') as f:
   f.write('hi,I am write plus2')

文檔內容:
hi,I am write plus2
上述兩個步驟搜這隻用到寫的功能,所以與w模式無異。可是w模式不能執行讀取操做,不能read。app

c.讀取內容
with open('write_plus.txt','w+') as f:
    print(f.read())

'w+'模式打開後,內容清空,沒有內容可讀。svg

d.先寫後讀—只能寫,不能讀
with open('write_plus.txt','w+') as f:#清空文檔
    f.write('hi,I am write plus3')
    print(f.read())#沒有內容可讀
沒有輸出

文檔內容:
hi,I am write plus3
如結果所示,上述語句並無將寫入的內容讀取出來,甚至沒有將以前已經存在的內容讀取出來,沒有任何返回。緣由是當執行到open語句識別到‘w+’的時候,文檔已經被清空了,即便執行到write語句,尚未close的狀況下,要寫的內容尚未被寫入,這時能夠讀取的內容就是空。
所以在寫入後直接讀取內容是不可行的。ui

e.先讀後寫—以前的內容無可讀,只能寫入以後的內容
with open('write_plus.txt','w+') as f:
    str_file=f.read()+' I am write plus 4'#這一步已經沒有內容可讀了
    f.write(str_file)

文檔內容:
,and I am write plus 4
設想先讀取內容,再把讀取的內容寫入是什麼結果呢?如上所示,當以w+模式打開的時候,f.read()已是空了,沒法保留原文檔的內容。
先寫後讀須要分步以非w模式先讀,再寫入。spa

總結: w+模式只是在w模式的基礎上增長可讀功能,read不報錯,但實際用該模式打開時,內容已經清空了。.net

二、r+模式:在r模式的基礎上增長可寫功能。

可讀可寫模式打開文本,文件不存在時報錯,文件有內容時以寫入的內容覆蓋。code

a.寫入內容
with open('read_plus.txt','r+') as f:
    f.write('hi,I am read plus1')

文檔內容:
hi,I am read plus1xml

b.覆蓋內容
with open('read_plus.txt','r+') as f:
    f.write('hi,I am read plus2')

文檔內容:
hi,I am read plus2
前兩種方式,除了沒法新建未存在文檔,其餘與w模式相同。blog

c.讀取內容
with open('read_plus.txt','r+') as f:
   print(f.read())

hi,I am read plus3

文檔能夠被讀取,如同’r’模式

d.先寫後讀—不能實現一步到位
with open('read_plus.txt','r+') as f:
   f.write('hi,I am read plus3')
   f.read()

文檔內容:
hi,I am read plus3
在寫的時候,因爲文檔並未被讀取,文檔將從頭寫入,未close狀況下,寫入的內容沒有保存到文檔,所以無可讀。
實際上,'r+'模式的確能夠讀取內容,只是在read步驟以前若是有write就沒有讀取

e.先讀後寫—能夠實現
with open('read_plus.txt','r+') as f:
    new_str=f.read().upper()
    print(new_str)
    f.write(new_str)
HI,I AM READ PLUS3

文檔內容:
hi,I am read plus3HI,I AM READ PLUS3
文檔打開後,內容是能夠被讀出來的,在文檔讀至結尾的的地方,纔將新內容寫入,所以能夠看到先讀後寫,能夠保留已讀取的內容,這樣相似「追加」模式。

思考:是否能夠將讀取的內容從頭寫入?
若是要從頭寫入,那麼就須要定位到開頭位置,可使用seek()方法,讀取到數據後,先定位到開頭,清空內容後truncate,再write

#恢復到「先寫後讀」完成後的步驟
with open('read_plus.txt','r+') as f:
    new_str=f.read().upper()
    f.seek(0)#定位到開頭
    f.truncate()
    f.write(new_str)

文檔內容:
I AM READ PLUS3
這樣,就用讀取並加工後的內容覆蓋了原來的內容,實現了打開一次文件實現將讀取的內容從新寫入的功能。

三、a+模式:在a模式的基礎上增長可讀功能。

可讀可寫模式打開文本,文件不存在時新建,文件有內容時以寫入的內容在文檔後面追加。

a.寫入內容
with open('append_plus.txt','r+') as f:
    f.write('hi,I am append plus1')

文檔內容:
hi,I am append plus1

b.追加內容
with open('read_plus.txt','r+') as f:
    f.write('hi,I am read plus2')

文檔內容:
hi,I am append plus1hi,I am append plus2
前兩種操做,同‘a’模式

c.讀取內容

事實上,‘a+’模式也沒法讀取內容,只不過在read的時候不報錯:

with open('append_plus.txt','a+') as f:
   print(f.read())
d.先寫後讀—不能實現
with open('append_plus.txt','a+') as f:
   f.write('hi,I am append plus3')
   print(f.read())

文檔內容:
hi,I am append plus1hi,I am append plus2hi,I am append plus3
沒有讀取內容,只不過執行了一個追加的操做。

e.先讀後寫—不能實現
with open('append_plus.txt','a+') as f:
    new_str=f.read().upper()+',and I am write plus 4'#f.read()是空的
    print(new_str)
    f.write(new_str)
HI,I AM READ PLUS3

文檔內容:
hi,I am append plus1hi,I am append plus2hi,I am append plus3,and I am write plus 4
有次能夠看出,因爲‘a+’模式並不能真的讀到內容,所以只能進行追加操做。

總結:'a+'模式只不過在‘a’模式上增長read不報錯屬性,並不能真的讀取內容,從而也不能將讀取的內容再寫入。

三種模式對比:

模式 文件不存在 再次寫入 讀取文件 將原內容讀寫
w+ 新建 覆蓋 打開後無內容 不可行
r+ 報錯 覆蓋 打開後即讀有內容
打開後先寫後讀無內容
可行,結合seek
不可行
a+ 新建 追加 打開後無內容 不可行

參考文檔:https://blog.csdn.net/weixin_40844116/article/details/84948081