Python文件讀寫(xiě)w+和r+區(qū)別解析
其實(shí)r 是只讀,只能讀不能寫(xiě),這是很明確的,但是r+是可讀寫(xiě),變成r+后還沒(méi)太明白到底加了什么,還是照樣寫(xiě)不了,有沒(méi)有這樣的體驗(yàn)?zāi)?如下代碼,只讀時(shí)
f = open("test.txt", 'r', encoding="utf-8") # 文件句柄 f.write("we are heros\n") data = f.read() print(data, type(data)) f.close()
這樣的話報(bào)錯(cuò)是明顯的:io.UnsupportedOperation: not writable,不可寫(xiě)應(yīng)都能理解,但是變成r+呢
f = open("test.txt", 'r+', encoding="utf-8") # 文件句柄 f.write("we are heros\n") data = f.read() print(data, type(data)) f.close()
你試過(guò)會(huì)發(fā)現(xiàn),什么也沒(méi)打印出來(lái),同時(shí)注意?。?!也沒(méi)有報(bào)錯(cuò)。到底是什么意思呢?
其實(shí)是由于讀寫(xiě)機(jī)制的問(wèn)題,當(dāng)一個(gè)文件被讀或者寫(xiě)一次后,文件中類(lèi)指針的東西指向的是整個(gè)文件的末尾,再次讀時(shí)從末尾開(kāi)始讀的話肯定是什么都
讀不到了,所以會(huì)出現(xiàn)這樣的問(wèn)題,和連續(xù)f.read()兩次的話,第二次什么都不會(huì)讀到的原因是相同的。那如何寫(xiě)完了接著讀呢,見(jiàn)代碼
f = open("test.txt", 'r+', encoding="utf-8") # 文件句柄 f.write("we are heros\n") f.seek(0) data = f.read() print(data, type(data)) f.close()
加上f.seek(0)使得類(lèi)指針的東西回到文件的開(kāi)頭然后從頭開(kāi)始讀即可。配合f.tell()使用,英文及字符返回的是那個(gè)類(lèi)指針的位置(也就是字符個(gè)數(shù)),但是中文的話是字符 個(gè)數(shù)*3,具體原因還得請(qǐng)大俠給講講。
r+與w+啥區(qū)別呢,不能簡(jiǎn)單的理解為讀寫(xiě)都可,細(xì)節(jié)之處略有不同!
- r+:先讀后寫(xiě)的話是在原有文本后添加, 因?yàn)樽x完后類(lèi)指針已經(jīng)在最末尾了,如果是先寫(xiě)后讀的話,是從頭開(kāi)始覆蓋式寫(xiě)(如只修改了前面的字符,后面字符是不會(huì)被刪掉的),類(lèi)指針停留在寫(xiě)完的末尾,不是文檔末尾,可以讀出未被覆蓋寫(xiě)的部分;
- w+:為先寫(xiě)后讀,先寫(xiě)完后使用f.seek(0)回到初始位置然后開(kāi)始讀,如果先讀的話是讀不出任何東西的,因?yàn)閣+也是純粹的覆蓋寫(xiě),在未使用寫(xiě)操作前文檔是完全空白的,無(wú)論之前該文件里有什么。so ,只能先寫(xiě)后讀。
- r和w的區(qū)別,r必須已經(jīng)存在這個(gè)文件了而 w時(shí)文件可以有也可以沒(méi)有,if有被覆蓋,else沒(méi)有則創(chuàng)建一個(gè)(慎用),r+的寫(xiě)也是覆蓋的!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)生成指定大小文件的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)生成指定大小文件,例如txt/圖片/視頻/csv等,文中的示例代碼講解詳細(xì),需要的可以參考下2023-08-08詳解tensorflow實(shí)現(xiàn)遷移學(xué)習(xí)實(shí)例
本篇文章主要介紹了詳解tensorflow實(shí)現(xiàn)遷移學(xué)習(xí)實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖示例
這篇文章主要介紹了Python利用matplotlib繪制約數(shù)個(gè)數(shù)統(tǒng)計(jì)圖,結(jié)合實(shí)例形式詳細(xì)分析了Python使用matplotlib進(jìn)行統(tǒng)計(jì)圖繪制的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Python爬蟲(chóng)抓取手機(jī)APP的傳輸數(shù)據(jù)
大多數(shù)APP里面返回的是json格式數(shù)據(jù),或者一堆加密過(guò)的數(shù)據(jù) 。這里以超級(jí)課程表APP為例,抓取超級(jí)課程表里用戶發(fā)的話題2016-01-01python爬蟲(chóng)之Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì)
這篇文章主要介紹了python爬蟲(chóng)怎樣通過(guò)Appium爬取手機(jī)App數(shù)據(jù)及模擬用戶手勢(shì),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08用ldap作為django后端用戶登錄驗(yàn)證的實(shí)現(xiàn)
這篇文章主要介紹了用ldap作為django后端用戶登錄驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python結(jié)合wxauto實(shí)現(xiàn)智能微信聊天機(jī)器人
wxauto?是我在2020年開(kāi)發(fā)的一個(gè)基于?UIAutomation?的開(kāi)源?Python?微信自動(dòng)化庫(kù),這篇文章主要介紹了Python結(jié)合wxauto實(shí)現(xiàn)智能微信聊天機(jī)器人,需要的朋友可以參考下2024-07-07python字符串str和字節(jié)數(shù)組相互轉(zhuǎn)化方法
下面小編就為大家?guī)?lái)一篇python字符串str和字節(jié)數(shù)組相互轉(zhuǎn)化方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03