鄙人學習筆記
文章目錄
文件讀寫
對文件實現讀寫的基本操作步驟爲:打開文件,讀寫文件,關閉文件。
本篇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()操作,因爲它沒有讀取得權限。如果讀取,則會報錯。
如下所示:
結果:
報錯!
若既想讀又想寫,則可以在各個參數值後添加【+】加號.如下圖所示: