檔案讀寫
一、開啟和關閉檔案
首先要對檔案進行操作就要先開啟一個檔案,以建立file對象,然後才能對它進行讀寫等操作。
#1.開啟:使用open函數
#2.關閉:使用close函數:重新整理緩衝區裡任何還沒有寫入的資訊,並關閉檔案,之後便不可再對該檔案進行讀寫。
# 在close之前也可以調用flush方法重新整理緩衝區
# fil = open(檔案名稱,開啟檔案的模式,緩衝區), 其中後面兩個參數可以省略,模式有讀(r)、寫(w)、追加(a)等,
#緩衝區(等於0:不會寄存,等於1:寄存一行,大於1:寄存區的緩衝大小,小於0:系統預設緩衝區大小)
二、讀取檔案
在以‘r’模式開啟檔案以後可以調用read函數一次性將檔案裡的內容全部讀取出來,也可以每次指定讀取多少位元組。
例子:
1 fil1 = open(‘yyc.txt‘,‘r‘,-1) #讀 檔案必須存在(目前是目前的目錄下)2 # buff3 =fil1.read() #一次性讀完3 buff4 =fil1.read(100) #讀100個位元組4 # print buff3+","+buff4 #這裡如果先read()再read(100) 則buff4為空白,因為read()已經讀完整個檔案了,就像c中指標已經到最後了。可以通過fil1.tell()函數列印指標當前位置5 print buff46 fil1.close() #關閉檔案
三、寫檔案
可以通過‘w’的方式開啟檔案,就可以建立一個可以寫的檔案對象。如果檔案存在則清空檔案再寫,如果檔案不存在則建立。
例子:
1 fil = open(‘yyc.txt‘,‘w‘,-1) #寫 如果檔案存在則清空檔案再寫,如果檔案不存在則建立2 fil.write("123456hello")3 fil.flush() #寫完最好重新整理一下4 fil.close() #關閉檔案
四、讀寫檔案r+、w+
‘r‘模式開啟的檔案建立的對象只能用read函數讀取檔案的內容,‘w’模式開啟的檔案又只能往裡寫內容。如果想實現在一個檔案關閉前既可以往裡寫內容,又可以讀取內容怎麼辦呢?這就是‘r+’和‘w+’所實現的功能。但是個人還是建議在一個檔案開啟關閉期間要麼讀要麼寫,因為這樣子會出現很奇怪的問題,可仔細閱讀下面的例子:
‘w+’模式例子1:如果在開啟檔案和關閉檔案之間先執行寫操作然後讀操作,最後讀出的內容為空白。
1 #先寫後讀2 fil5 = open(‘yyc.txt‘,"w+",0) #既寫又讀 如果檔案存在則先清空檔案,如果檔案不存在則建立3 fil5.write(‘b‘) #先寫入4 fil5.flush() #寫完最好重新整理一下5 buff2 =fil5.read() #因為此時指標指向寫入內容的後面,所以內容為空白6 print ‘w+模式先寫後讀: ‘+buff2 #讀出的內容是未覆蓋的內容,這裡為空白啦,因為此時指標指向寫入內容的後面,即文檔末尾7 fil5.close()
‘w+’模式例子2:如果在開啟檔案和關閉檔案之間先執行讀操作然後寫操作,讀出的內容也為空白。
1 #先讀後寫2 fil5 = open(‘yyc.txt‘,"w+",0) #既寫又讀 如果檔案存在則先清空檔案,如果檔案不存在則建立3 buff2 =fil5.read() #由於清空了檔案,所以內容為空白4 print ‘w+模式先讀後寫: ‘+buff2 #讀出的內容是未覆蓋的內容,這裡還沒寫寫入,所以為空白5 fil5.write(‘123456‘) #6 fil5.flush() #寫完最好重新整理一下7 fil5.close()
從上面兩個例子可以看出,在以‘w+’模式開啟檔案並同時執行讀寫操作時,不管是先寫後讀還是先讀後寫,讀出的內容都是空,但是其中的道理各有不同哦(代碼注釋裡差不多也清楚了)。
‘r+’模式例子1:如果在開啟檔案和關閉檔案之間先執行寫操作然後讀操作,讀出的內容是寫入後未覆蓋的內容
1 #先寫後讀2 fil3 = open(‘yyc.txt‘,"r+",-1) #既讀又寫 從檔案開始位置覆蓋內容3 fil3.write(‘66666‘)4 fil3.flush() #寫完最好重新整理一下5 buff2 = fil3.read() #必須先重新整理再做讀操作,6 print ‘r+模式先寫後讀:‘+buff2 #讀出的內容是未覆蓋的內容,因為指標在寫入檔案後指向了寫入後的位置,即文檔末尾7 fil3.close()
‘r+‘模式例子2:如果在開啟檔案和關閉檔案之間先執行讀然後寫操作,運行報錯。
1 #先讀後寫(報錯)2 # fil3 = open(‘yyc.txt‘,"r+",-1) #既讀又寫 從檔案開始位置覆蓋內容3 # buff2 = fil3.read() #先讀4 # print ‘r+模式先讀後寫:‘+buff2 #輸出的內容是覆蓋後的內容,也就是說他執行過write了?很奇怪,並且報錯5 # # fil3.flush() #加不加效果一樣 6 # fil3.write(‘66666‘)#後寫7 # fil3.flush() #寫完最好重新整理一下8 # fil3.close()
五、追加寫入檔案a,a+
如果想保留檔案現有內容,只是把新內容加入原有檔案的尾部或者說新增檔案內容而不影響原有內容,則可以用a或者a+模式。
‘a+’模式例子1:如果在開啟檔案和關閉檔案之間先執行寫操作然後讀操作,最後讀出的內容為空白。
1 #先寫後讀2 fil6 = open(‘yyc.txt‘,‘a+‘,0) #追加 如果檔案存在則追加內容,如果檔案不存在則建立3 fil6.write(‘1234‘) #4 fil6.flush() #寫完最好重新整理一下 ,查看檔案寫入成功5 print ‘a+模式先寫後讀: ‘+fil6.read() #但讀出來是空,因為此時指標指向寫入內容的後面6 fil6.close() #關閉檔案
‘a+’模式例子2:如果在開啟檔案和關閉檔案之間先執行讀操作然後寫操作,讀出的內容也為為空白。
1 #先讀後寫2 fil6 = open(‘yyc.txt‘,‘a+‘,0) #追加 如果檔案存在則追加內容,如果檔案不存在則建立3 print ‘a+模式先讀後寫: ‘+fil6.read() #但讀出來是空4 fil6.write(‘1234‘) #5 fil6.flush() #寫完最好重新整理一下 ,查看檔案寫入成功6 fil6.close() #關閉檔案
綜上6個例子,其實r+,w+,a+有異曲同工之處,也就是檔案指標指向的位置,決定了讀寫的內容。只要理解了指標在檔案中的位置,就不難理解檔案的讀寫啦。