Cree un perro guardián en Python para buscar cambios en el sistema de archivos

Muchas veces se necesita procesar un archivo en el momento de su creación o de su modificación. Esto se puede hacer siguiendo los cambios en un directorio en particular. Hay muchas formas en python de seguir los cambios realizados en un directorio. Una de esas formas es usar el watchdog módulo. Como sugiere el nombre, este módulo observa el directorio dado y puede notificar si se crea o cambia un archivo.

Módulos necesarios

  • Watchdog
    Para instalar watchdog, ejecute este comando en la terminal.
    pip install watchdog
    
  • Registro
    Viene integrado con python, por lo que no es necesario instalarlo externamente.

Ahora profundicemos en el código que registrará todos los cambios registrados. Este código registrará los cambios registrados solo en el directorio actual.

# import the modules
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
  
if __name__ == "__main__":
    # Set the format for logging info
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s - %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S')
  
    # Set format for displaying path
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
  
    # Initialize logging event handler
    event_handler = LoggingEventHandler()
  
    # Initialize Observer
    observer = Observer()
    observer.schedule(event_handler, path, recursive=True)
  
    # Start the observer
    observer.start()
    try:
        while True:
            # Set the thread sleep time
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Producción:
perro guardián-Python

El código anterior registrará todos los cambios registrados en un directorio. Si desea realizar cambios en el momento en que se crea o modifica un archivo, puede hacerlo utilizando el siguiente código.

# import time module, Observer, FileSystemEventHandler
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
  
  
class OnMyWatch:
    # Set the directory on watch
    watchDirectory = "/give / the / address / of / directory"
  
    def __init__(self):
        self.observer = Observer()
  
    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler, self.watchDirectory, recursive = True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Observer Stopped")
  
        self.observer.join()
  
  
class Handler(FileSystemEventHandler):
  
    @staticmethod
    def on_any_event(event):
        if event.is_directory:
            return None
  
        elif event.event_type == 'created':
            # Event is created, you can process it now
            print("Watchdog received created event - % s." % event.src_path)
        elif event.event_type == 'modified':
            # Event is modified, you can process it now
            print("Watchdog received modified event - % s." % event.src_path)
              
  
if __name__ == '__main__':
    watch = OnMyWatch()
    watch.run()

Producción:
Python-perro guardián

Descifrando el código

Observador

es la Observer clase que observa cualquier cambio en el sistema de archivos y luego envía el evento al controlador de eventos. Supervisa el sistema de archivos y busca cualquier cambio.

Controlador de eventos

El controlador de eventos es un objeto que será notificado cuando algo suceda en el sistema de archivos. En general, un script se escribe para vigilar cualquier tipo de archivos nuevos creados o modificados como jpg, xml, etc. Por ejemplo, en el código a continuación, PatternMatchingEventHandler hereda de la FileSystemEventHandler clase y se usa para hacer precisamente eso. Algunos métodos útiles de esta clase son:

  • on_any_event: se ejecutará para cualquier evento.
  • on_created: se ejecuta cuando se crea un archivo o un directorio.
  • on_modified: se ejecuta cuando se modifica un archivo o se cambia el nombre de un directorio.
  • on_deleted: se ejecuta cuando se elimina un archivo o directorio.
  • on_moved: se ejecuta cuando se mueve un archivo o directorio.

Cada uno de esos métodos recibe el objeto de evento como primer parámetro, y el objeto de evento tiene 3 atributos:

  • event_type: modificado/creado/movido/eliminado
  • is_directory: Verdadero/Falso
  • src_path: ruta/a/observar/archivo

La siguiente secuencia de comandos se usa para observar solo archivos .csv que usan la extensión PatternMAtchingEventHandler. Puede ampliar aún más la lista de patrones si desea observar más de un tipo de archivo.

import watchdog.events
import watchdog.observers
import time
  
  
class Handler(watchdog.events.PatternMatchingEventHandler):
    def __init__(self):
        # Set the patterns for PatternMatchingEventHandler
        watchdog.events.PatternMatchingEventHandler.__init__(self, patterns=['*.csv'],
                                                             ignore_directories=True, case_sensitive=False)
  
    def on_created(self, event):
        print("Watchdog received created event - % s." % event.src_path)
        # Event is created, you can process it now
  
    def on_modified(self, event):
        print("Watchdog received modified event - % s." % event.src_path)
        # Event is modified, you can process it now
  
  
if __name__ == "__main__":
    src_path = r"C:\Users\GeeksforGeeks\PycharmProjects\requests hotel"
    event_handler = Handler()
    observer = watchdog.observers.Observer()
    observer.schedule(event_handler, path=src_path, recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

Producción:
perro guardián-python

Aquí, con la ayuda de PatternMAtchingEventHandler podemos aprovechar el procesamiento de solo eventos relacionados con archivos con la extensión .csv. Al extender una clase de controlador de eventos proporcionada por Watchdog, obtenemos la capacidad de manejar eventos modificados, creados, eliminados y movidos mediante la implementación de los métodos de clase descritos anteriormente.

Publicación traducida automáticamente

Artículo escrito por Chaitanya Tyagi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *