2010-08-16 71 views
2

我有一個簡單的python腳本,只需要一個文件名,並吐出該文件的修改版本。我想重定向標準輸出(在命令行中使用'>'),以便我可以使用我的腳本覆蓋我的修改文件,例如, python myScript.py test.txt > test.txt使用Linux重定向覆蓋Python腳本中的文件

當我這樣做時,生成的test.txt不包含任何來自原始test.txt的文本 - 只是由myScript.py添加的。但是,如果我不重定向標準輸出,那麼修改就會正確出現。

更具體地講,這裏有一個例子:


myScript.py:

#!/usr/bin/python 
import sys 

fileName = sys.argv[1] 
sys.stderr.write('opening ' + fileName + '\n') 

fileHandle = file(fileName) 
currFile = fileHandle.read() 
fileHandle.close() 

sys.stdout.write('MODIFYING\n\n' + currFile + '\n\nMODIFIED!\n') 

的test.txt

Hello World 

結果的python myScript.py test.txt > test.txt

MODIFYING 



MODIFIED! 

回答

7

它這樣工作的原因是,巨蟒甚至開始之前,Bash解釋重定向操作,並打開一個輸出流輸出到標準輸出寫入文件。該操作將文件截斷爲0,換句話說,它將清除文件的內容。所以當你的Python腳本啓動時,它會看到一個空的輸入文件。

最簡單的解決方案是將stdout重定向到不同的文件,然後將其重命名爲原始文件名。

python myScript.py test.txt > test.out && mv test.out test.txt 

或者,你可以改變你的Python腳本修改後的數據寫回文件本身,所以你就不必在所有標準輸出重定向。

+0

正確。或者一個替代方案。給Python腳本一個參數來修改而不是簡單地打印輸出。 – Wolph 2010-08-16 23:07:59

+0

@WoLpH:我相信你在編輯這個想法的時候提出了你的評論;-) – 2010-08-16 23:09:07

+0

的確如此。完美的解決方案,但你已經有我的+1;) – Wolph 2010-08-16 23:11:22

1

嘗試將其重定向到一個新文件,重定向運算符可能會在追加之前刪除該文件。

1

Debian中moreutils軟件包中的應用程序sponge可以很好地處理這個問題。

python myScript.py test.txt | sponge test.txt 

正如其名稱所示,sponge將完全開放的test.txt並寫出標準輸入的全部內容之前耗盡它的標準輸入。

你可以得到最新版本的海綿here。 moreutils主頁是here