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.
3 Réponses :
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.
for i, v in outputlist: print (f'Test {i} {v}ed') #Test 1 passed #Test 2 failed #Test 3 passed
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>
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.