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:
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:
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:
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