2011-06-02 64 views
2

我正在編寫一個腳本,用於輪詢查找新文件的目錄。在Python寫完之前,Python會打開一個文件嗎?

在這種情況下,是否有必要進行某種錯誤檢查以確保文件在訪問之前完全寫入?

我不想在文件完全寫入磁盤之前處理文件,但因爲我想從文件獲得的信息接近開始,所以似乎可以提取我需要的數據沒有意識到文件沒有被寫入。

這是我應該擔心的事情,還是將文件鎖定,因爲操作系統正在寫入硬盤驅動器?

這是在Linux系統上。

回答

3

在Unix上,除非寫入應用程序不正常,否則文件不會被鎖定,您可以從中讀取文件。

讀者當然必須準備好處理一個不完整的文件(記住寫作者可能會發生I/O緩衝)。

如果這是一個非首發,你就必須考慮一些方案的作家和讀者,例如同步的:

  • 明確鎖定文件;
  • 將數據寫入臨時位置,並且只在文件完成時纔將其移至其最終位置(如果源位置和目標位於同一文件系統中,則可以以原子方式完成移動操作)。
+0

+1:「在Unix上」。這個問題不是一個真正的Python問題。 – 2011-06-02 13:57:22

0

如果您對寫入程序有一定的控制權,讓它將文件寫入其他地方(如/ tmp目錄),然後在完成後將它移動到正在監視的目錄中。

如果你沒有控制程序的寫作('控制'我的意思是'編輯源代碼'),你可能無法使它做文件鎖定,所以這就是大概出去了。在這種情況下,您可能需要了解有關文件格式的信息,以瞭解作者何時完成。例如,如果作者總是將「DONE」寫爲文件中的最後四個字符,則可以打開該文件,尋找結尾,並閱讀最後四個字符。

+0

需要注意的是,您寫入文件的位置以及將文件移動到的位置必須位於* same *文件系統捲上,否則您將遇到同樣的問題。 – Gabe 2013-08-27 21:27:25

5

通常在Linux上,除非您使用某種鎖定,否則兩個進程可以非常高興地一次打開同一個文件,即使是寫入也是如此。有三種方式避免這種問題:

  1. 鎖定

    通過讓筆者應用鎖文件,它可以防止讀者從部分讀取文件。但是,大多數鎖都是諮詢性的,所以仍然完全有可能看到部分結果。 (存在強制鎖定,但強烈建議使用而不是,理由是它們太脆弱了。)編寫正確的鎖定代碼相對困難,並且將這些任務委派給專家庫是正常的(例如,數據庫引擎!)特別是,你不想在聯網的文件系統上使用鎖定;它是一個巨大的麻煩,當它的工作原因,往往徹底的錯誤。

  2. 公約

    一個文件可以代替使用其他名稱,你不會自動找上讀出側相同的目錄中創建(例如,.foobar.txt.tmp),然後原子重命名爲正確的名稱(例如,foobar.txt)。這可以很好地工作,只要你注意處理之前的運行無法正確寫入文件的可能性。如果一次只能有一個作家,這實現起來相當簡單。

  3. 擔心的不是它

    被頻繁寫入文件中最常見的類型是一個日誌文件。這些信息可以很容易地以這樣一種方式編寫,即信息只能附加到文件中,所以任何讀者都可以安全地查看文件的開頭,而不必擔心文件的任何變化。這在實踐中運作良好。

在這裏沒有什麼特別的Python。所有在Linux上運行的程序都有相同的問題。

+0

思考它,它也不是Linux特有的問題。大多數操作系統都有同樣的問題。 (Windows有點不同,因爲默認情況下鎖定的更多,這會導致其他問題。) – 2014-01-12 09:23:49

0

是的。

我更喜歡Donal描述的「文件命名約定」和重命名解決方案。