Обнаружение изменений в файле и запись их в файл

#python #file

#python #файл

Вопрос:

Я создал скрипт, который обнаруживает изменения в файлах, расположенных в определенном каталоге. Я пытаюсь записать все эти изменения в 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()
 

Комментарии:

1. почему бы вам просто не открывать файл регулярно и f.write() для него?

2. Может быть, было бы лучше переписать вашу функцию печати. В противном случае, как правило, для хранения выходных данных любого скрипта мы используем python.py > changes.txt .

3. Это сложно… @NilsWerner

4.К вашему сведению, кажется, что он работает, когда я его запускаю. Я запустил скрипт, создал файл и удалил файл, и в итоге получил три something happened! строки changes.txt . Вы проверяете changes.txt после завершения работы вашего скрипта? Из-за буферизации вывода вы можете не видеть никаких выходных changes.txt данных, пока файл не будет закрыт.

5. Итак, я должен просто вставить это в код и удалить st.dout?

Ответ №1:

Я бы рекомендовал что-то вроде

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

как вы можете видеть, контроль над тем, куда будут записаны ваши выходные данные, был передан вызывающему (тому, который создает экземпляр MyHandler ), а не вызываемому ( on_modified ).

Это означает, что вы также можете

 event_handler = MyHandler(sys.stdout)
 

и видеть вывод вместо вывода, помещаемого в файл.

Дополнительное преимущество: используя диспетчер контекста, вы можете быть уверены, что файл закрыт правильно, даже если возникают ошибки.

Комментарии:

1. Большое вам спасибо, но что, если я хочу, чтобы скрипт каждый раз сохранял выходные данные в один и тот же файл, а не записывал поверх старого? А также пронумеруйте, что что-то произошло! например. что-то случилось! #1

2. Добавление к файлам находится в документации Python, а приращение может быть выполнено в MyHandler переменной-члене.