鄙人學習筆記
文章目錄
- 檔案讀寫
- 打開檔案
- 舉個例子1(以讀方式打開)
- 舉個例子2(以寫方式打開)
- 讀取檔案
- read
- 舉個例子1
- readline
- 舉個例子2(繼續用例子1的note.txt檔案)
- readlines
- 舉個例子3
- for循環
- 舉個例子4
- 寫入檔案
- write
- 舉個例子1
- writelines
- 舉個例子2
- 舉個例子3(以追加模式寫入)
檔案讀寫
對檔案實作讀寫的基本操作步驟為:打開檔案,讀寫檔案,關閉檔案。
本篇BLOG和本系列的下一篇BLOG會對檔案讀寫的步驟進行一一舉例說明。
打開檔案
file_object = open(file_name, access_mode='r', buffering=-1)
功能:打開一個檔案,傳回一個檔案對象。
參數:file_name————檔案名;
access_mode————打開檔案的方式,如果不寫預設為‘r’
檔案模式 操作
r 以讀方式打開.檔案必須存在
w 以寫方式打開檔案.若檔案不存在,則建立,若存在,則清空原有内容
a 以追加模式打開.若檔案不存在,則建立,若存在,也保留檔案内容,并在檔案末尾繼續寫
r+ 以讀寫模式打開 檔案必須存在
w+ 以讀寫模式打開檔案不存在則建立,存在清空原有内容
a+ 以讀寫模式打開 追加模式
rb 以二進制讀模式打開 同r
wb 以二進制寫模式打開 同w
ab 以二進制追加模式打開 同a
rb+ 以二進制讀寫模式打開 同r+
wb+ 以二進制讀寫模式打開 同w+
ab+ 以二進制讀寫模式打開 同a+
buffering————參數0表示無緩沖,1表示有行緩沖,如果是大于1表示直接指明緩沖區大小。如果不寫或為負數則表示使用系統預設提供的緩沖機制。在py中,通常情況下這個參數我們都不寫,直接用系統預設的就OK了.
傳回值:成功傳回檔案流對象。失敗得到IOError。
我們用open()打開一個檔案,會傳回給變量fd一個檔案對象。打開一個檔案之後,我們就可以對這個檔案對象進行讀寫操作了。
備注:buffering表示,開辟的緩沖區類型。緩沖,表示系統自動的在記憶體中為每一個正在使用的檔案開辟一個緩沖區,從記憶體向磁盤輸出資料必須先送到記憶體緩沖區,裝滿緩沖區在一起送到磁盤中去。這樣做,是為了減少與磁盤的互動次數,進而提高效率、保護了磁盤。舉個例子:我們在用word寫論文時,寫了好幾頁,但沒儲存(假設word也沒有幫我們自動儲存),這些沒儲存的論文,就在緩沖區内。如果這時突然斷電(假設我們此時用的是台式電腦)那麼寫了那麼久的論文就會丢失。
圖示:
舉個例子1(以讀方式打開)
我們在主py檔案test02.py所在的檔案夾内建立一個txt檔案,裡面寫一些資料,如下圖所示:
我們在主py檔案中讀取檔案:
結果:
備注:别忘了最後一定要關閉檔案!
舉個例子2(以寫方式打開)
(1)若檔案不存在
首先,我們看一下我們的檔案清單:
在python中,我們打開一個不存在的檔案None.txt:
我們再看一下,檔案清單:
新的檔案建立出來了!
(2)檔案存在, 且檔案有内容
檢視一下我們的note.txt檔案,結果:
清空了!
讀取檔案
read
read([size])
用來直接讀取位元組到字元串中,最多讀取給定數目個位元組。如果沒有給定size參數(預設值為-1)或者size值為負,檔案将被讀取直至末尾。檔案過大時候,不建議直接讀取到檔案末尾,因為會消耗大量記憶體,讀取時間也會更長,建議在non-blocking模式下使用。
舉個例子1
首先看一下我們的資料檔案:
(1) 不設定size參數,直接讀取到檔案末尾
我們讀取一下:
輸出結果:
(2)一次讀取16個位元組
①我們按照一次16個位元組讀取檔案:
輸出結果:
②我們按照一次1024個位元組讀取檔案:
輸出結果:
若一次想要讀取的位元組數,大于檔案的位元組數,則檔案有多少位元組,就讀取多少位元組。
(3)一次讀取8個位元組,但仍然想讀完全部檔案
循環讀取:
結果:
readline
readline([size])
讀取打開檔案的一行(讀取下個行結束符之前的所有位元組)。沒有給定size參數,則讀取整行整行,包括行結束符,并作為字元串傳回。和 read() 相同,它也有一個可選的 size 參數,預設為 -1,代表讀至行結束符。如果提供了該參數,如果行的位元組數超過size,則會傳回不完整的行。
舉個例子2(繼續用例子1的note.txt檔案)
(1)不設定size參數,讀取一行
我們讀取一下:
結果:
備注:當我們沒有指定size時,readline遇到換行符才會結束。
(1)設定size參數
①我們按照一次4個位元組讀取行:
結果:
我們再讀取一次:
結果:
由結果可知,第二次讀取時,readline會沿着第一次讀取的末尾,繼續讀取這一行剩下内容。
readlines
readlines([sizeint])
該方法并不像其它兩個輸入方法一樣傳回一個字元串。它會讀取所有(剩餘的)行然後把它們作為一個字元串清單傳回。它的可選參數sizhint代表傳回的最大位元組大小,當sizeint不足該行的位元組數時,也會得到這一行的内容。我們在使用時,一般不設定參數。
舉個例子3
讀取:
結果:
由結果可知,每一行,讀取成了清單中的一個元素。
for循環
for line in fd:
print(line)
檔案對象本身也是一個可疊代對象,在for循環中可以疊代檔案的每一行。
舉個例子4
讀取:
結果:
寫入檔案
write
write(string)
功能與 read() 和 readline() 相反。它把含有文本資料或二進制資料塊的字元串寫入到檔案中去。
舉個例子1
我們向空檔案None.txt寫入資料:
結果:
再寫一行:
結果:
備注:如果想換行就要人為添加換行符\n。
writelines
writelines(str_list)
和 readlines() 相反,writelines()方法是針對清單的操作,它接受一個字元串清單作為參數,将它們寫入檔案。行結束符并不會被自動加入,是以如果需要的話,你必須在調用writelines()前給每行結尾加上行結束符。
舉個例子2
我們None.txt寫入資料:
結果:
舉個例子3(以追加模式寫入)
原來的note.txt檔案:
寫入:
結果:
備注:在追加模式a下,不能read()操作,因為它沒有讀取得權限。如果讀取,則會報錯。
如下所示:
結果: