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

나는 수신자 대신, 당신은 호출자 (MyHandler을 instanciating 것)을 물려되었습니다에 기록 될 outputwill 경우에 대한 제어를

#!/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() 

같은 것을 권 해드립니다 (on_modified).

이 당신은 또한

event_handler = MyHandler(sys.stdout) 

을 대신 출력의 출력은 파일에 투입되는 것을 볼 수 있다는 것을 의미합니다.

추가 이점 : 컨텍스트 관리자를 사용하면 오류가 발생해도 파일이 제대로 닫혔는지 확인할 수 있습니다.

+0

대단히 감사합니다. 그러나 스크립트가 매번 같은 파일에 출력을 저장하고 이전 파일을 덮어 쓰지 않으려면 어떻게해야합니까? 그리고 또한 일어난 일에 번호를 매기십시오! 예. 뭔가 일이 생겼어! # 1 – adaminspaceship

+0

파일에 추가하는 것은 파이썬 문서에 있으며, incrementor는 'MyHandler' 멤버 변수에서 할 수 있습니다. –

+0

오케이, 고마워요 !!!! – adaminspaceship

관련 문제