2016-10-13 99 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

相关问题