如何設定檔案的緩衝

weixin_34321977發表於2017-08-17
實際案例

將檔案內容寫入到硬體裝置時,使用系統呼叫,這類I/O操作的時間很長。為了減少I/O操作的次數,檔案通常使用緩衝區,當有足夠多的資料時才進行系統呼叫。檔案的緩衝行為,分為全緩衝、行緩衝和無緩衝。

那麼如何設定Python中檔案物件的緩衝行為?

解決方案:

  • 全緩衝:open函式的buffering設定為大於1的整數n,n為緩衝區大小
  • 行緩衝:open函式的buffering設定為1
  • 無緩衝:open函式的buffering設定為0

全緩衝程式碼如下:

# -*- coding: utf-8 -*-

# 全緩衝
f = open('demo_1.txt', 'w', buffering=1024)

f.write('abc')

注:此處不能呼叫close(),因為一旦呼叫該方法,我們不能對檔案進行讀寫操作,進而緩衝區中的資料會在檔案讀寫許可權關閉之前將資料寫入檔案,致使我們設定檔案的緩衝的目的失敗。

執行上述程式碼,我們開啟demo_1.txt檔案檢視是否寫入資料。不出意外,我們開啟該檔案是看不到“abc”的這三個字母的。為了驗證我們的緩衝區是否設定成功,我們在上述程式碼的基礎上新增如下程式碼:

f.write("*" * 1021)

我們再執行一下,開啟demo_1.txt檔案發現仍舊是空檔案。我們再來看看程式碼,現在我們使用了1024B,這時我們只要再寫入一個字元,之前緩衝區中的資料就會寫入檔案。不妨嘗試一下,我們繼續新增如下程式碼:

f.write("+")

執行程式並開啟demo_1.txt檔案,我們發現其內容如下:

abc*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

這時,我們可以發現在檔案內容中並沒有我們最後新增的“+”。因此,我們可以斷定當我們輸入的資料大於緩衝區n的大小時,Python會將緩衝區n大小的資料寫入檔案中,為後面我們輸入的資料騰出空間進行快取。

行緩衝程式碼如下:

# 行緩衝
f = open('demo_2.txt', 'w', buffering=1)

f.write("abcd")
f.write("123456")

執行上述程式碼並開啟demo_2.txt檔案發現該檔案為空檔案。既然是行緩衝,我們猜想是不是要換行才會將緩衝區的資料寫入檔案。因此,我們新增如下程式碼:

f.write("\n")

這時,我們開啟demo_2.txt檔案就可以看到我們輸入的資料了。

注:行緩衝一般用於“互動式”文字檔案,在Windows系統本人未成功實現行緩衝程式碼功能,但在Linux系統下成功實現行緩衝程式碼功能。

無緩衝程式碼如下:

# 無緩衝
f = open('demo_3.txt', 'w', buffering=0)

f.write('abc')

執行程式並開啟demo_3.txt檔案發現資料已經寫入到檔案中。

相關文章