
關(guān)于使用Python操作文件,無非就是對文件進行讀、寫、索引的操作,難度系數(shù)并不大,基本上就三個知識點:open方法的使用、操作file對象以及with語句。
open() 方法
首先,先來看一下open方法的常用語法格式。
open(file, mode='r', encoding='UTF-8')
file參數(shù)為文件的路徑,mode參數(shù)即你想要進行何種操作,encoding即文件的編碼。
關(guān)于mode參數(shù)可參考下列代碼。
r:只讀模式打開文件(默認模式)
w:只寫模式打開文件,文件存在則覆蓋,文件不存在就創(chuàng)建文件
a: 追加模式打開文件,新的內(nèi)容寫入到已有內(nèi)容之后,文件若不存在,則創(chuàng)建新文件進行寫入
t: 文本模式(默認)
b:二進制模式
x: 只寫模式,新建一個文件,如果該文件已存在則會報錯
+:可讀可寫,需配合r、w或a
一般來說,我們是需要上述mode參數(shù)中的2-3個配合使用的。例如:wb代表的則是二進制文件寫入、r+與w+均為讀寫操作、rb+是讀寫二進制文件。不過需要注意的是,rw是不可以共同使用的。
open()方法會返回一個file對象,file對象也有很多的方法可供使用。
file對象
# 關(guān)閉文件。關(guān)閉后文件不能再進行讀寫操作
file.close()
# 從文件讀取指定的字節(jié)數(shù),如果未給定或為負則讀取所有
file.read([size])
# 讀取整行,包括 "\n" 字符
file.readline([size])
# 讀取所有行并返回列表,若給定sizeint>0,則是設(shè)置一次讀多少字節(jié),這是為了減輕讀取壓力
file.readlines([sizeint])
# 返回文件當前位置,即顯示當前文件指針的位置
file.tell()
# 刷新文件內(nèi)部緩沖,直接把內(nèi)部緩沖區(qū)的數(shù)據(jù)立刻寫入文件, 而不是被動的等待輸出緩沖區(qū)寫入
file.flush()
# 將字符串寫入文件,返回的是寫入的字符長度
file.write(str)
# 向文件寫入一個序列字符串列表,如果需要換行則要自己加入每行的換行符
file.writelines(sequence)
# 從文件的首行首字符開始截斷size個字符,無size則從當前位置截斷,后面的所有字符被刪除
file.truncate([size])
首先需要注意,每次使用open()最好能配合使用close方法來關(guān)閉文件。關(guān)閉后的文件不能再進行讀寫操作,否則會觸發(fā) ValueError 錯誤。養(yǎng)成使用close關(guān)閉文件的習慣還是挺有意義的。
read和readline及readlines方法的區(qū)別是:read默認讀取整個文件,也可指定字節(jié)讀取。readline只能返回1行的文本,也就是讀取到“\n”時停止。而readlines則會返回一個列表,以"\n"作為分隔符。不過需要注意,分隔符"\n"之類的轉(zhuǎn)義字符也會被存在readlines返回的列表中。
關(guān)于文件指針的概念:文件被打開后會有一個指針指向文件的某個位置,我們將其稱為文件指針,簡單來講,就是文件當前的位置所在,有點索引的味道。
truncate方法需要注意的是,windows系統(tǒng)下的換行代表2個字符。
with語句
其實,文件處理還有一個常用語法,那就是with語句。
在看with語句的語法之前,我們要思考些問題。有時我們會忘記close文件句柄,有時會轉(zhuǎn)角遇見讀取數(shù)據(jù)的異常,此時我們需要對open方法進行異常處理以使得代碼更加健壯。
file = open('c:/text.txt','r')
try:
data = file.read()
finally:
file.close()
此時,雖然代碼更健壯了,但也稍顯有些冗余(一個文件還可以接受,當有多個文件的時候代碼將特別不友好)。with語句便可以優(yōu)雅的解決這個問題。案例格式如下:
with open('c:/text.txt','r') as file:
data = file.read()
with語句適用于對資源進行訪問的場合,不管使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”操作,釋放資源。比如文件使用后自動關(guān)閉,線程中鎖的自動獲取和釋放等。with擁有著簡單優(yōu)雅的語法,還可以很好的聯(lián)系上下文處理產(chǎn)生的異常,可以說是python語言處理文件的一大利器。
當然,with語句如此強大,功能肯定不會限于文件處理,不過呢,這個話題太長了(筆者太懶了......)。筆者就先寫到這了。