1
votes

Comment analyser un fichier texte pour des lignes dynamiques avec un index changeant en Python

Je suis nouveau sur Python. besoin d'analyser un fichier texte avec une variable dynamique (index changeant).

J'ai le fichier texte suivant

def main():
    file = open("Console_log_28-12-2018_02-31-55.txt","r")
    lines = file.readlines()
    file.close()

    for line in lines:
        line=line.strip()
        index = 1
        str (index)
        #if line == "Step"index"passed successfully!":
        if line.find("Step 1 passed successfully!") != -1:
           print ( line )
main()

ma sortie finale \ un autre fichier texte devrait être: Test 1 réussi Le test 2 a échoué Test 3 réussi

packet1_ref_time = 13.64
packet2_ref_time = 73.68
16.11.2018 16:33:03 {Step 1 passed successfully!}
16.11.2018 16:33:06 {}
packet1_ref_time = 17.25
packet2_ref_time = 71.112
16.11.2018 16:33:03 {Step 2 Failed!}
16.11.2018 16:33:06 {}
packet1_ref_time = 13.877
packet2_ref_time = 78.366
16.11.2018 16:33:03 {Step 3 passed successfully!}
16.11.2018 16:33:06 {}

Le résultat est "28.12.2018 02:36:16 {Étape 1 réussie!}" comme prévu . et c'est évident car je recherche une étape exacte (étape 1 dans ce cas) et ce dont j'ai besoin pour rechercher un index dynamique comme je l'ai écrit dans le commentaire: #if line == "Step" index "passé avec succès!":

cependant je ne peux pas trouver la syntaxe correcte sur la façon de le coder.


1 commentaires

Le fichier journal a-t-il une constante de 4 lignes pour chaque étape? Si c'est le cas, vous pouvez simplement obtenir une ligne sur quatre et l'imprimer.


3 Réponses :


1
votes

Pour trouver des lignes, vous pouvez utiliser une expression régulière, c'est-à-dire re module

['Step 1 passed', 'Step 2 Failed', 'Step 3 passed']

[0-9] + signifie tout nombre naturel, tandis que | signifie ou dans re dans ce cas passé avec succès ou Failed.

EDIT : Après avoir repensé votre question, j'ai conclu que re.findall serait encore mieux, voir mon exemple ci-dessous

text = '''better in this case
packet1_ref_time = 13.64
packet2_ref_time = 73.68
16.11.2018 16:33:03 {Step 1 passed successfully!}
16.11.2018 16:33:06 {}
packet1_ref_time = 17.25
packet2_ref_time = 71.112
16.11.2018 16:33:03 {Step 2 Failed!}
16.11.2018 16:33:06 {}
packet1_ref_time = 13.877
packet2_ref_time = 78.366
16.11.2018 16:33:03 {Step 3 passed successfully!}
16.11.2018 16:33:06 {}'''
tests = re.findall('Step [0-9]+ passed|Step [0-9]+ Failed',text)
print(tests)

Résultat:

for line in lines:
    if bool(re.search('Step [0-9]+ (passed successfully)|(Failed)!',line)):
        print(line)

Notez que pour plus de clarté, j'ai simplement assigné une chaîne à text . Vous devez attribuer la valeur renvoyée par .read () à votre variable.


0 commentaires

1
votes
for i, v in outputlist:
    print (f'Test {i} {v}ed')
#Test 1 passed
#Test 2 failed
#Test 3 passed

0 commentaires

1
votes

Vous pouvez utiliser l'opérateur de formatage de chaîne avec l'argument de chaîne pour rechercher la fonction comme indiqué ci-dessous. L'opérateur de formatage de chaîne peut être utilisé partout où nous avons besoin de remplacements dans la chaîne.

def main():
    file = open("Console_log_28-12-2018_02-31-55.txt","r")
    lines = file.readlines()
    file.close()

    for line in lines:
        line=line.strip()
        index = 1
        str (index)
        #if line == "Step"index"passed successfully!":
        if line.find("Step %d passed successfully!"%index) != -1:
           print ( line )
main()

Pour en savoir plus à ce sujet, veuillez consulter la documentation https://docs.python.org/2/library/stdtypes.html#string-formatting-operations p>


0 commentaires