2011-10-13 64 views
2

我對文件緩衝區工作原理的瞭解相當薄弱,所以請原諒這個問題的簡單性。我有一段Python代碼,等待文件出現,然後讀取它。Python的open()是否讀取了一個未刷新的緩衝區?

while 1: 
    try: 
     f = open('file.txt') 
     f.close() 
     print "Message received." 
     break 
    except: 
     time.sleep(0.3) 

其中file.txt是其他程序寫入的文件。但是,我懷疑Python正在讀取文件,然後在文件file.txt完全寫入之前關閉句柄(即,在我正在編寫該文件的程序中調用close()之前)。這應該是可能的嗎?

如果是這樣,有沒有一種方法可以檢測(在上面列出的讀取程序中)在調用f.close()之前緩衝區是否已被刷新?

+0

沒有調用'f.read()'? –

+0

在這種情況下,不,因爲我在這個小程序中的目標是檢查文件是否存在,並且是完整的。但是'f.read()'會解決我的問題嗎? (未刷新緩衝區的問題) – Gilead

回答

3

不要爲此使用while-loop。有更好的方法,但細節取決於您的操作系統。

Linux有inotify。您可以編寫一個簡單的pyinotify腳本來觀察該目錄,並對IN_CLOSE_WRITE事件(在該文件已關閉後僅發生)作出反應。

OSX(FSEvents)和Windows有類似的設施。

+0

謝謝,這正是我所尋找的。我使用pyinotify來監視FS變化,但我沒有想到將它用於這個非常簡單的任務。 – Gilead

1

Python不會阻止您閱讀另一個進程尚未完成寫入的文件。

如果我正在等待來自另一個進程的文件,我通常會將該進程寫入其他文件名。一旦這個過程寫完了,它就會關閉並將文件重命名爲我期望的文件名。這樣我就不會收到部分文件。

1

要檢查文件是否存在,請使用os.path.existsos.path.isfile,如果您要求它是「常規」文件。

在Unix上,當文件打開爲write/append時,將創建一個目錄條目。但寫入文件的字節在從I/O刷新之前不會真正顯示在那裏(從讀卡器的角度看)。沒有一種正常的方式來詢問文件上是否存在「待處理」的I/O;至少不是在Unix上。

0

一般來說,Linux在一個進程打開一個文件進行讀取而沒有任何問題,而另一個進程已經打開進行寫入。考慮做一些事情,如tail -f $SOME_FILE實時更新文件;如果嘗試打開讀取文件必須阻止並等待作者關閉文件,那麼這可能無法工作。