2015-08-31 4 views
4

Я хотел бы знать, как проверить изменение определенного файла в папке. Я обнаружил, что модуль сторожевого таймера может проверять изменения для файлов в папке, но мне нужно только 1 файл (с фиксированным именем).Проверить конкретный файл был изменен с помощью python watchdog

Просьба просить об этом и благодарить.

class MyHandler(FileModifiedEvent): 
    def on_modified(self, event): 

if __name__ == "__main__": 
     integrity_file_path = DATASTORE_DIRECTORY_PATH + '/schedule.xml' 
     event_handler = MyHandler() 
     observer = Observer() 
     observer.schedule(MyHandler(), path=integrity_file_path,recursive=True) 
     observer.start() 

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

ответ

0

Я бы сказал, вы можете проверить время изменения файла в соответствии с

How to get file creation & modification date/times in Python?

Определить порог и сравнить текущее время с временем изменений, вы можете знать, если файл обновлено. Это будет работать, если файл не будет получать очень часто.

Но в любом случае, если кто-то открыл файл, набрал какой-то мусор, а затем удалил и сохранил.

3

Вы можете подклассифицировать обработчик события watchdog.events.PatternMatchingEventHandler и изменить его, чтобы делать все, что хотите, в случае события. Вы должны установить шаблон как имя файла, который вы хотите контролировать.

Однако, это немного сложно. Под обложками используется pathtools.patterns, чтобы выполнить его сопоставление с образцом. И это также добавляет каталог в соответствие шаблону. Это означает, что вам нужно передать в обработчик события полный путь к файлу в качестве вашего имени файла «шаблон» аргумент. Если вы этого не сделаете, соответствие шаблонов не удастся, и вы не получите никаких уведомлений о событиях.

Вот пример ниже:

import sys, os.path, time, logging 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 


class MyEventHandler(PatternMatchingEventHandler): 
    def on_moved(self, event): 
     super(MyEventHandler, self).on_moved(event) 
     logging.info("File %s was just moved" % event.src_path) 

    def on_created(self, event): 
     super(MyEventHandler, self).on_created(event) 
     logging.info("File %s was just created" % event.src_path) 

    def on_deleted(self, event): 
     super(MyEventHandler, self).on_deleted(event) 
     logging.info("File %s was just deleted" % event.src_path) 

    def on_modified(self, event): 
     super(MyEventHandler, self).on_modified(event) 
     logging.info("File %s was just modified" % event.src_path) 

def main(file_path=None): 
    logging.basicConfig(level=logging.INFO, 
     format='%(asctime)s - %(message)s', 
     datefmt='%Y-%m-%d %H:%M:%S') 
    watched_dir = os.path.split(file_path)[0] 
    print 'watched_dir = {watched_dir}'.format(watched_dir=watched_dir) 
    patterns = [file_path] 
    print 'patterns = {patterns}'.format(patterns=', '.join(patterns)) 
    event_handler = MyEventHandler(patterns=patterns) 
    observer = Observer() 
    observer.schedule(event_handler, watched_dir, recursive=True) 
    observer.start() 
    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 
    observer.join() 



if __name__ == "__main__": 
    if len(sys.argv) > 1: 
     path = sys.argv[1] 
     main(file_path=path.strip()) 
    else: 
     sys.exit(1) 

Выполнение сценария сторожевой питона (до изменения файла):

(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml 
watched_dir = /usr/local/src/stackoverflow/watchdog 
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml 

Изменение файла schedule.xml в отдельной консоли:

[[email protected] watchdog]# echo "I just modified this file" >> schedule.xml 

Результаты после изменения schedule.xml:

(stackoverflow)[[email protected] stackoverflow]# python watchschedule.py /usr/local/src/stackoverflow/watchdog/schedule.xml 
watched_dir = /usr/local/src/stackoverflow/watchdog 
patterns = /usr/local/src/stackoverflow/watchdog/schedule.xml 
2015-08-31 19:30:31 - File /usr/local/src/stackoverflow/watchdog/schedule.xml was just modified 
+0

Это работает как рекламируется, спасибо. Как бы я взял необходимость ввода файловой структуры в командной строке? Ничто не работает. Я пробовал три наиболее логичных места в основной функции. –

+0

@ElliotRobert Вы можете жестко указать путь к файлу. В разделе 'if __name__ ==" __main __ ":' удалите весь блок if-else и замените его вызовом функции 'main()', передав ваш hardcoded путь в качестве аргумента 'main()' , Например: 'main (file_path = '/ usr/local/src/stackoverflow/watchdog/schedule.xml')' –

+0

Это работало только для самого каталога, в том числе имя файла, вызвало ошибку, мне пришлось запустить .strip() на полный путь с именем файла для его работы. Спасибо миллиону Джо. –