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()
Le code Python avec la balise code Perl, c'est pas idéal
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).
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
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()
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.
Blond, bouclé, toujours le sourire aux lèvres...
Python c'est bon, mangez-en.