可讀可寫模式打開文本,文件不存在時新建,文件有內容時以寫入的內容覆蓋。python
with open('write_plus.txt','w+') as f: f.write('hi,I am write plus1')
相應目錄下生成’write_plus.txt’
文檔內容:
hi,I am write plus1
web
with open('write_plus.txt','w+') as f: f.write('hi,I am write plus2')
文檔內容:
hi,I am write plus2
上述兩個步驟搜這隻用到寫的功能,所以與w模式無異。可是w模式不能執行讀取操做,不能read。app
with open('write_plus.txt','w+') as f: print(f.read())
'w+'模式打開後,內容清空,沒有內容可讀。svg
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
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
可讀可寫模式打開文本,文件不存在時報錯,文件有內容時以寫入的內容覆蓋。code
with open('read_plus.txt','r+') as f: f.write('hi,I am read plus1')
文檔內容:
hi,I am read plus1
xml
with open('read_plus.txt','r+') as f: f.write('hi,I am read plus2')
文檔內容:
hi,I am read plus2
前兩種方式,除了沒法新建未存在文檔,其餘與w模式相同。blog
with open('read_plus.txt','r+') as f: print(f.read()) hi,I am read plus3
文檔能夠被讀取,如同’r’模式
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就沒有讀取
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
這樣,就用讀取並加工後的內容覆蓋了原來的內容,實現了打開一次文件實現將讀取的內容從新寫入的功能。
可讀可寫模式打開文本,文件不存在時新建,文件有內容時以寫入的內容在文檔後面追加。
with open('append_plus.txt','r+') as f: f.write('hi,I am append plus1')
文檔內容:
hi,I am append plus1
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’模式
事實上,‘a+’模式也沒法讀取內容,只不過在read的時候不報錯:
with open('append_plus.txt','a+') as f: print(f.read())
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
沒有讀取內容,只不過執行了一個追加的操做。
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