實際案例
將文件內容寫入到硬件設備時,使用系統調用,這類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文件發現數據已經寫入到文件中。