2015-09-09 30 views
1

我編寫了一個python程序來連續寫入文件。在另一個進程正在寫入時清空文件

#!/usr/bin/python 
import sys 
import time 

file = open("data",'w') 

i = 1 
while True: 
    file.write("%d\n" % i) 
    file.flush() 
    i+=1 
    time.sleep(0.01) 

而且一段時間後,該data文件有一些大小非0然後一邊蟒寫程序仍在運行。我嘗試使用echo "" > data命令來清空現有內容。 但它不起作用。 python程序一直向文件寫入數據時,文件大小仍然保持不變。

如何解決這個問題?

回答

0

你應該append模式下打開文件,並使用truncate()刪除舊內容:

#!/usr/bin/python 
import sys 
import time 

file = open("data",'a') 
file.truncate() 

i = 1 
while True: 
    file.write("%d\n" % i) 
    file.flush() 
    i+=1 
    time.sleep(0.01) 

然後同時此代碼運行時,你可以這樣做:

> data 

從你的shell能隨時爲0字節截斷該文件,而無需通過文件獲取添加空字節尋求

打開以附加模式文件(如一個模式的第一個字符)導致所有隨後的寫入操作此流在檔案結尾從而避免填充先前位置以空字節的​​情況下發生。

0

通常寫入的文件具有獨佔訪問權限。 當打開的應用程序仍然打開它時,您無法覆蓋它們。您需要將程序更改爲在每次寫入後關閉並重新打開以使您的方案正常工作。

0

如果你真的要做到這一點只需打開該文件中wa沒有記錄模式。

file = open("data",'wa') 

一個標準的形式給出,需要兩個電話:

#!/usr/bin/python 
import sys 
import time 
from contextlib import closing 

with closing(open("data",'w')): 
    with open("data",'a') as file: 
     i = 1 
     while True: 
      file.write("%d\n" % i) 
      file.flush() 
      i+=1 
      time.sleep(0.01) 

或者truncate方法:https://docs.python.org/2/library/stdtypes.html#file.truncate

檢查:http://tldp.org/HOWTO/Secure-Programs-HOWTO/avoid-race.html

+0

'wa'模式?似乎沒有這種用法。只有'W +''一個+' –

+0

它不記錄@ richard.g但是當你需要打開追加模式加上截斷如果存在 – klashxx

0

您可以在每次寫入後關閉文件。
這會給其他progs(umount,rm,mv,du)一個公平的機會來處理數據。
我不知道有關的開銷,系統緩存可能會幫助你很多在這裏。

0

echo "" > data將清除的文件。由於循環內的睡眠時間是0.01秒它會立即增加了新的內容文件。

這是在這裏看到(在文件中的字符數減少)

$ wc data 
4336 4335 27733 data 
$ echo "" > data 
$ wc data 
    176 175 29848 data 

這多少清楚,如果你增加睡眠時間

$ wc data 
11 10 69 data 
$ echo "" > data 
$ wc data 
1 0 1 data 

這也是文件的大小減小可見

$ ls -l data 
-rw-rw-r-- 1 user user 14 Sep 9 15:33 data 
$ echo "" > data; ls -l data 
-rw-rw-r-- 1 user user 1 Sep 9 15:33 data 
+0

是工作方式類似的魅力,但文件大小保持不變,怎麼樣? –

+0

@ richard.g的文件大小也降低。你是如何衡量文件大小? – shanmuga

相關問題