Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de sortie de boucles imbriquées

    26 novembre 2010 à 0:06:32

    Bonjour,

    Je débute en python et j'ai écrit un script qui me permet d'analyser un fichier de logs pour en extraire les lignes contenant des erreurs vers un fichier de destination. Le code et la libellé de l'erreur sont ajoutées à la fin de chaque ligne identifiée.
    Pour cela, j'utilise un script de boucles imbriquées. Mon problème c'est que mon script s'arrête à la première ligne d'erreur analysée.
    Je ne sais pas si cela vient des types de boucles que j'emploies ou de mon incompréhension à écrire une sortie de boucle adéquate.
    Voici mon code, si quelqu'un a une idée je suis demandeur ! merci par avance.

    # -*- coding:Latin-1 -*-
    
    # ce script permet de lire les lignes du fichier de logs du jour courant
    # et d'analyser la présence d'erreurs signalée par la présence du mot Erreur sur les caractères 20 à 25 de la ligne
    # SI la ligne présente une erreur les 25 premiers caractères sont copiés dans le fichier de destination,
    # et on ajoute sur la même ligne le code et le libellé de l'erreur contenu dans le fichier de références des alarmes
    
    # Import des modules os et datetime
    import os
    from datetime import datetime
    from scom_alarme import *
    
    # Stockage d'une variable date pour appeler le fichier du log du jour en cours
    a = datetime.now().strftime("%Y%m%d")
    # Stockage d'une variable date pour datage de la ligne d'erreur récupérée
    b = datetime.now().strftime("%d" + "/" + "%m" + "/" + "%Y" + " ")
    
    def filtre(source, destination):
        # Création du fichier log portant la date et l'heure courantes dans son nom et ouverture du fichier en mode write
        destination = open(a + "_SCOM_ALARMES.log", "w")
        # Ouverture du fichier log du présent jour à analyser
        source = open("log" + a + ".log", "r")
    	# Ouverture fichier de références des alarmes (code erreur + libellé)
        tri = open("alarmes.txt", "r")
    	# Boucle pour tester la présence du mot Erreur dans chaque ligne du fichier de logs
        for txt1 in source:
            if txt1 == "": # sortie de la boucle lorsque l'on atteint la dernière ligne du fichier de logs
                break
            if txt1[19:25]=="Erreur": # on cherche la présence du mot Erreur dans chaque ligne du fichier de logs
                while 1: # si le mot Erreur est présent, on cherche le code erreur et son libellé depuis la variable tri
                    txt2 = tri.readline()
                    if txt2 == "": # sortie de la boucle lorsque l'on ne trouve pas le code erreur dans la liste d'alarmes de référence
                        break
                    if txt2[0:4] == txt1[37:41]: # lorsque l'on trouve la présence du code erreur
                        destination.write(b + txt1[0:25] + " " + txt2 + "\n") # on reprend le code et son libellé pour l'écrire dans le fichier de destination qui stocke les erreurs
                        break
        # Fermeture des fichiers
        source.close()
        destination.close()
        tri.close()
    
    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2010 à 1:14:19

      Tu a essayé avec "readlines()"(avec un "s")?
      • Partager sur Facebook
      • Partager sur Twitter
        26 novembre 2010 à 2:23:13

        Le code Python avec la balise code Perl, c'est pas idéal :D

        Bref, sinon je pense que ligne 26 tu peux déjà remplacer :
        for txt1 in source
        par :
        for txt1 in source.readlines()

        C'est déjà un bon début mais je pense qu'il y a d'autres problèmes notemment dans le while 1 à partir de la ligne 30, non seulement le code peut être simplifié, mais surtout j'ai l'impression que tu ne revient pas au début du fichier alarmes.txt après l'avoir parcouru, du coup seule la première boucle fait un parcours complet du fichier.

        Sinon nivea style ce serait bien d'utiliser des noms de variables un peu moins obscurs (je pense surtout à txt1 et txt2, ça facilite pas la compréhension).
        • Partager sur Facebook
        • Partager sur Twitter

        Blond, bouclé, toujours le sourire aux lèvres...

          26 novembre 2010 à 7:31:14

          ce test n'a aucun intérêt ... ça s'arrêtera seul en fin de texte.
          for txt1 in source:
                  if txt1 == "": # sortie de la boucle lorsque l'on atteint la dernière ligne du fichier de logs
                      break
          

          while 1 pour quoi faire ? et il y a 1 teste de trop ...
          while 1: # si le mot Erreur est présent, on cherche le code erreur et son libellé depuis la variable tri
                      txt2 = tri.readline()
                      if txt2 == "": # sortie de la boucle lorsque l'on ne trouve pas le code erreur dans la liste d'alarmes de référence
                          break
                      if txt2[0:4] == txt1[37:41]: # lorsque l'on trouve la présence du code erreur
                          destination.write(b + txt1[0:25] + " " + txt2 + "\n") # on reprend le code et son libellé pour l'écrire dans le fichier de destination qui stocke les erreurs
                          break
          


          faudrait au moins un exemple de log ...
          • Partager sur Facebook
          • Partager sur Twitter

          Python c'est bon, mangez-en. 

          Anonyme
            26 novembre 2010 à 22:02:29

            Comme dit précédemment si tu veux utiliser une boucle pour détecter les fichiers vides ou l'EOF d'un fichier, tu peux utiliser ce code par exemple.

            source = open("log" + a + ".log", "r")
            while 1:
               line = source.readline()
               if not line:
                 break
               line = line.rstrip()
               ... # traitement
            f.close()
            
            • Partager sur Facebook
            • Partager sur Twitter

            Problème de sortie de boucles imbriquées

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown