1. 程式人生 > >python 檔案輸出與重定向 ,輸出的內容會在記憶體中暫存,不會立刻輸出到檔案中

python 檔案輸出與重定向 ,輸出的內容會在記憶體中暫存,不會立刻輸出到檔案中

1、使用write寫磁碟檔案

python 中使用write,將資料寫入到檔案中,但是並不是write之後,就立刻寫入到檔案(比如a.txt)中,python的write會先將資料放在記憶體的緩衝區中,等到積累了一定的量,再一起寫入到磁碟檔案中。這樣可以提高效能,減少訪問磁碟的次數。總結一下,在程式中使用write寫檔案,資料不會立刻寫入到檔案中,也就是開啟檔案看不到剛才寫入的資料,但是,使用flush(),可以將記憶體中的資料寫入到磁碟檔案中。

f = open('f.txt','w')
f.write('1,2,3')
while(1):
    pass
解析:如上的程式,你開啟f.txt檔案是看不到‘1,2,3'的,因為'1,2,3'還在記憶體的緩衝區中,並未寫入到磁碟檔案中。
f = open('f.txt','w')
f.write('1,2,3')
f.flush()
while(1):
    pass

解析:使用flush()可以將緩衝區中的資料立刻寫入到磁碟檔案中,開啟檔案可以看到"1,2,3"

f = open('f.txt','w')
f.write('1,2,3')
f.close()
while(1):
    pass
解析:當關閉檔案時,記憶體緩衝區的資料也會寫入到磁碟檔案中。

總結1:

使用write寫檔案,資料先存放在記憶體的緩衝區,關閉檔案,或使用flush(),或記憶體快取區的資料積累到一定的量,就會將記憶體緩衝區的資料寫入到檔案中。

2、輸出重定向

import sys
temp = sys.stdout
file = open('f.txt','w')
sys.stdout = file
print (1,2,3)
sys.stdout.close()
sys.stdout = temp
print (1,2,3)
解析:

1、temp = sys.stdout:標準輸出管道

2、sys.stdout = file:將標準輸出管道連到開啟的檔案

3、sys.stdout.close():關閉管道,所以,使用print 輸出的資料,本來是存放在管道中,close()之後,全部寫入檔案中。

4、sys.stdout = temp:重新連線到標準的輸出

上述程式執行後,輸出“1,2,3”,f.txt中會寫入"1,2,3"

管道存在於記憶體中,在管道建立時,為緩衝區分配一個頁面大小。

重定向也存在跟write一樣的問題,write寫入的資料是先存在記憶體緩衝區中,使用flush或關閉檔案,才寫入到磁碟檔案中。同理,重定向,print 輸出的檔案也存放在管道(應該是記憶體的某塊區域),等管道關閉,或整個程式結束後,才寫入到重定向的檔案中。

import sys
temp = sys.stdout
file = open('f.txt','w')
sys.stdout = file
print (1,2,3)
while(1):
    pass


解析:print(1,2,3)之後,資料還在管道中,並未寫入到記憶體中。所以在f.txt中看不到資料。
import sys
temp = sys.stdout
file = open('f.txt','w')
sys.stdout = file
print (1,2,3)
sys.stdout.close()
while(1):
    pass
解析:print(1,2,3)之後,使用sys,stdout.close()關閉管道,所以管道內的資料會寫入到磁碟檔案中。


一個疑問:

在一個程式中,既使用重定向,又使用write,那麼就存在,從管道寫入到磁碟檔案,和記憶體緩衝區寫入到磁碟檔案兩種情況,兩種情況不好協調,所以,如果是這種情況,最好使用flush(),將資料立刻寫入到磁碟檔案中,不然,我們都不確定,是管道資料先寫入磁碟檔案,還是記憶體緩衝區的資料先寫入到磁碟檔案

import sys
temp = sys.stdout
file = open('f.txt','w')
sys.stdout = file
print (1,2,3)
sys.stdout.flush()
file.write("aaa")
file.flush()