2016-10-13 133 views
0

我製作了一個腳本,用於檢測位於特定目錄中的文件的更改。我正在嘗試將所有這些更改寫入changes.txt文件。爲此我使用sys.stdout = open('changes.txt','w')指令。檢測文件中的更改並將它們寫入文件

問題是,無論何時運行腳本並更改目錄中的文件並保存它,都會創建一個名爲changes.txt的空文件。這個文件從來沒有寫過!

#!/usr/bin/python 
import time 
import sys 
from watchdog.observers import Observer 
from watchdog.events import FileSystemEventHandler 
sys.stdout = open('changes.txt','w') 

class MyHandler(FileSystemEventHandler): 
def on_modified(self, event): 
    print "something happened!" 


if __name__ == "__main__": 
event_handler = MyHandler() 
observer = Observer() 
observer.schedule(event_handler, path='.', recursive=False) 
observer.start() 

try: 
    while True: 
     time.sleep(1) 
except KeyboardInterrupt: 
    observer.stop() 
+0

你爲什麼不經常打開這個文件,並用'f.write()'來打開它? –

+0

也許重寫你的打印功能可能會更好。否則,一般來說,要存儲任何腳本的輸出,我們使用'python.py> changes.txt'。 –

+0

這很複雜... @NilsWerner – adaminspaceship

回答

0

我建議像

#!/usr/bin/python 

import time 
import sys 
from watchdog.observers import Observer 
from watchdog.events import FileSystemEventHandler 

class MyHandler(FileSystemEventHandler): 
    def __init__(self, f): 
     self.f = f 
    def on_modified(self, event): 
     self.f.write("something happened!\n") 
     self.f.flush() 


if __name__ == "__main__": 
    with open('changes.txt','w') as f: 
     event_handler = MyHandler(f) 
     observer = Observer() 
     observer.schedule(event_handler, path='.', recursive=False) 
     observer.start() 

     try: 
      while True: 
       time.sleep(1) 
     except KeyboardInterrupt: 
      observer.stop() 

,你可以看到,在這裏你的輸出功率將寫入一直流傳給調用者(一instanciating MyHandler)的控制,而不是被調用者的(on_modified)。

這意味着,你也可以做

event_handler = MyHandler(sys.stdout) 

,並看到輸出,而不是輸出被放入該文件。

一個額外的好處是:使用上下文管理器,即使發生錯誤,也可以確保文件關閉正確。

+0

非常感謝您,但是如果我希望腳本每次都將輸出保存到同一個文件中,而不是在舊文件上寫字?並且還要記下發生的事情!例如。發生了一些事! #1 – adaminspaceship

+0

追加文件在Python文檔中,增量器可以在MyHandler成員變量中完成。 –

+0

好的,謝謝! – adaminspaceship

相關問題