web-dev-qa-db-fra.com

Lire à partir d'un fichier journal pendant son écriture à l'aide de python

J'essaie de trouver une belle façon de lire un fichier journal en temps réel en utilisant python. Je voudrais traiter les lignes d'un fichier journal une par une au fur et à mesure de son écriture. D'une manière ou d'une autre, je dois continuer à essayer de lire le fichier jusqu'à ce qu'il soit créé, puis continuer à traiter les lignes jusqu'à ce que je termine le processus. Existe-t-il une manière appropriée de procéder? Merci.

43
Anon

Vous pouvez essayer avec quelque chose comme ça:

import time

while 1:
    where = file.tell()
    line = file.readline()
    if not line:
        time.sleep(1)
        file.seek(where)
    else:
        print line, # already has newline

L'exemple a été extrait de ici .

26
Pablo Santa Cruz

Jetez un oeil à ce PDF à partir de la page 38, ~ diapositive I-77 et vous trouverez toutes les informations dont vous avez besoin. Bien sûr, les autres diapositives sont également incroyables, mais celles-ci traitent spécifiquement de votre problème:

import time
def follow(thefile):
    thefile.seek(0,2) # Go to the end of the file
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1) # Sleep briefly
            continue
        yield line
44
Wayne Werner

Comme il s'agit de Python et journalisation balisés, il existe une autre possibilité de le faire.

Je suppose que cela est basé sur un Python, basé sur logging.Handler.

Vous pouvez simplement créer une classe qui obtient l'instance de journalisation (nommée) et écraser la fonction emit pour la placer dans une interface graphique (si vous avez besoin d'une console, ajoutez simplement un gestionnaire de console au gestionnaire de fichiers)

Exemple:

import logging

class log_viewer(logging.Handler):
    """ Class to redistribute python logging data """

    # have a class member to store the existing logger
    logger_instance = logging.getLogger("SomeNameOfYourExistingLogger")

    def __init__(self, *args, **kwargs):
         # Initialize the Handler
         logging.Handler.__init__(self, *args)

         # optional take format
         # setFormatter function is derived from logging.Handler 
         for key, value in kwargs.items():
             if "{}".format(key) == "format":
                 self.setFormatter(value)

         # make the logger send data to this class
         self.logger_instance.addHandler(self)

    def emit(self, record):
        """ Overload of logging.Handler method """

        record = self.format(record)

        # ---------------------------------------
        # Now you can send it to a GUI or similar
        # "Do work" starts here.
        # ---------------------------------------

        # just as an example what e.g. a console
        # handler would do:
        print(record)

J'utilise actuellement un code similaire pour ajouter une TkinterTreectrl.Multilistbox pour afficher la sortie de l'enregistreur au moment de l'exécution.

Hors site: L'enregistreur n'obtient des données que lorsqu'il est initialisé, donc si vous voulez avoir toutes vos données disponibles, vous devez les initialiser au tout début. (Je sais que c'est ce qui est attendu, mais je pense que cela mérite d'être mentionné.)

5
R4PH43L