讀寫檔案是最常見的io操作。python內建了讀寫檔案的函式,用法和c是相容的。
讀寫檔案前,我們先必須了解一下,在磁碟上讀寫檔案的功能都是由作業系統提供的,現代作業系統不允許普通的程式直接操作磁碟,所以,讀寫檔案就是請求作業系統開啟乙個檔案物件(通常稱為檔案描述符),然後,通過作業系統提供的介面從這個檔案物件中讀取資料(讀檔案),或者把資料寫入這個檔案物件(寫檔案)。
1.open函式
file object=open(file_name [,access_mode][,buffering])下面是引數的詳細資訊:
這裡是開啟乙個檔案的不同模式的列表:
模式描述
r開啟乙個檔案為唯讀。檔案指標置於該檔案的開頭。這是預設模式。
rb開啟乙個檔案只能以二進位制格式讀取。檔案指標置於該檔案的開頭。這是預設模式。
r+開啟用於讀取和寫入檔案。檔案指標將會在檔案的開頭。
rb+開啟用於讀取和寫入二進位制格式的檔案。檔案指標將會在檔案的開頭。
w開啟乙個檔案只寫。覆蓋該檔案,如果該檔案存在。如果該檔案不存在,則建立用於寫入乙個新的檔案。
wb開啟乙個檔案只能以二進位制格式寫入。覆蓋該檔案,如果該檔案存在。如果該檔案不存在,則建立用於寫入乙個新的檔案。
w+開啟用於寫入和讀取的檔案。覆蓋現有的檔案,如果檔案存在。如果該檔案不存在,則建立讀取和寫入新的檔案。
wb+開啟用於寫入和讀取的二進位制格式的檔案。覆蓋現有的檔案,如果檔案存在。如果該檔案不存在,則建立讀取和寫入新的檔案。
a將開啟追加檔案。檔案指標是在檔案的結尾。也就是說,該檔案是在附加模式。如果該檔案不存在,它創造了寫入乙個新的檔案。
ab將開啟追加的二進位制格式的檔案。檔案指標在該檔案的結束。也就是說,該檔案為追加模式。如果該檔案不存在,它建立並寫入乙個新的檔案。
a+開啟為追加和讀取檔案。檔案指標在該檔案的結束。該檔案將為追加模式。如果該檔案不存在,它建立並讀取和寫入的新檔案。
ab+開啟兩個追加和讀取的二進位制格式的檔案。檔案指標在該檔案的結束。該檔案將在追加模式。如果該檔案不存在,它建立並讀取和寫入的新檔案。
關閉檔案用close:
乙個檔案物件的close()方法重新整理未寫入的資訊,並關閉該檔案的物件,在這之後沒有資料內容可以執行寫入。
寫入檔案用write:
write()方法寫入字串到任何乙個開啟的檔案。要注意的是python字串可以具有二進位制資料,而不僅僅是文字。
讀取檔案用read:
read()方法讀取乙個開啟的檔案的字串。要注意的是python字串可以具有二進位制資料,而不僅僅是文字。
需要注意的是:由於緩衝,字串可能實際上沒有出現在該檔案中,直到呼叫flush()或close()方法被呼叫.
一般的檔案流操作都包含緩衝機制,write方法並不直接將資料寫入檔案,而是先寫入記憶體中特定的緩衝區。
flush方法是用來重新整理緩衝區的,即將緩衝區中的資料立刻寫入檔案,同時清空緩衝區。
正常情況下緩衝區滿時,作業系統會自動將緩衝資料寫入到檔案中。
至於close方法,原理是內部先呼叫flush方法來重新整理緩衝區,再執行關閉操作,這樣即使緩衝區資料未滿也能保證資料的完整性。
如果程序意外退出或正常退出時而未執行檔案的close方法,緩衝區中的內容將會丟失。
2. with open
由於檔案讀寫時都有可能產生ioerror
,一旦出錯,後面的f.close()
就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally
來實現:
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
但是每次都這麼寫實在太繁瑣,所以,python引入了with
語句來自動幫我們呼叫close()
方法:
with open('/path/to/file
', 'r'
) as f:
print(f.read())
呼叫read()
會一次性讀取檔案的全部內容,如果檔案有10g,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)
方法,每次最多讀取size個位元組的內容。另外,呼叫readline()
可以每次讀取一行內容,呼叫readlines()
一次讀取所有內容並按行返回list
。因此,要根據需要決定怎麼呼叫。
如果檔案很小,read()
一次性讀取最方便;如果不能確定檔案大小,反覆呼叫read(size)
比較保險;如果是配置檔案,呼叫readlines()
最方便:
for line inf.readlines():
print(line.strip()) #
把末尾的'\n'刪掉
寫檔案和讀檔案是一樣的,唯一區別是呼叫open()
函式時,傳入識別符號'w'
或者'wb'
表示寫文字檔案或寫二進位制檔案:
>>> f = open('/users/michael/test.txt
', 'w'
)>>> f.write('
hello, world!')
>>> f.close()
你可以反覆呼叫write()
來寫入檔案,但是務必要呼叫f.close()
來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()
方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()
的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with
語句來得保險:
with open('/users/michael/test.txt
', 'w'
) as f:
f.write(
'hello, world!
')
要寫入特定編碼的文字檔案,請給open()
函式傳入encoding
引數,將字串自動轉換成指定編碼
>>> f = open('/users/michael/gbk.txt
', '
r', encoding='
gbk'
)>>>f.read()'測試
'
遇到有些編碼不規範的檔案,你可能會遇到unicodedecodeerror
,因為在文字檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,open()
函式還接收乙個errors
引數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:
十六進製制表示的位元組
總結:以後讀寫檔案都使用with open語句,不要再像以前那樣用f = open()這種語句了
對於多個檔案的讀寫,可以寫成以下兩種方式:
with open('/home/xbwang/desktop/output_measures.txt
','r
') as f:
with open(
'/home/xbwang/desktop/output_measures2.txt
','r
') as f1:
with open(
'/home/xbwang/desktop/output_output_bk.txt
','r
') as f2:
........
........
........
with open('/home/xbwang/desktop/output_measures.txt
','r
') as f:
........
with open(
'/home/xbwang/desktop/output_measures2.txt
','r
') as f1:
........
with open(
'/home/xbwang/desktop/output_output_bk.txt
','r
') as f2:
........
python(檔案讀取寫入)
python讀寫檔案 1.open 使用open開啟檔案後一定要記得呼叫檔案物件的close 方法。比如可以用try finally語句來確保最後能關閉檔案。file object open thefile.txt try all the text file object.read finally ...
python讀取 寫入檔案
python程式設計 從入門到實踐 讀書筆記 1.讀取檔案並且對檔案內容進行列印有三種方式 with open test.txt as fo for lins in fo print lins.rstrip with open test.txt as fo lines fo.read print l...
python檔案的讀取寫入
coding utf 8 author 木之易 date 2018 7 23 20 12 1.開啟檔案 引數1.要開啟的檔案 引數2.開啟檔案的方式 w或w 或a或wb 方式開啟,如果檔案不存在,會自動建立檔案 r模式,如果檔案不存在,會觸發異常錯誤,不會自動建立檔案 接受用來讀寫檔案的控制代碼 w...