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.
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 .
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
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é.)