2017-10-20 7 views
1

J'essaye d'analyser un fichier journal pour certaines occurrences. Comme le fichier journal peut être très volumineux, il est nécessaire de filtrer les lignes qui ne présentent aucun intérêt pour l'application dont nous avons besoin. l'idée était que je fasse une liste avec les 4 ou 5 chaînes que je veux rechercher, puis boucle sur les lignes dans une autre liste qui contient les lignes que j'ai conservées du fichier journal.Vérifier si un élément d'une liste est présent dans les éléments d'une liste en python

Le fichier journal est le journal d'un proxy et est utilisé pour obtenir une vue d'où viennent les demandes La première réduction a été facile en recherchant "GET /" dans la ligne et ne stockez que ceux qui ont cette dedans.

with open('logfile', 'r') as f: 
    for line in f: 
     if "GET /" in line: 
      lines.append(line) 

La liste des besoins "lignes de puis être de réduire les lignes qui contiennent un d'un certain nombre de chaînes dans l'url

l1 = ['/Treintickets/aankopen', '/booking/Tickets', '/Acheter/Billets', ...] 

J'ai essayé la compréhension de la liste, mais cela n'a pas fonctionné:

result = [l for l in lines if l1 in l] 

Existe-t-il un moyen de faire fonctionner ceci sans avoir à boucler les grandes lignes de chaque membre de 'l1'?

+0

Il n'y a que 4 ou 5 chaînes dans l1 et aucune ne se chevauchent, elles sont toutes identiques dans différentes langues. Quelle serait l'amélioration de la transformation en ensemble? – Erwin

+0

Si vous utilisez la réponse de wim, cela ne sert à rien (j'ai un peu mal lu la question). –

Répondre

2

Vous pouvez utiliser la fonction intégrée any:

result = [line for line in lines if any(substring in line for substring in l1)] 

Ou, vous pouvez envisager d'utiliser une expression rationnelle pour cela.

+0

Cependant, cela est de complexité cubique. –

+0

Les contrôles de sous-chaînes sont fortement optimisés et le 'any' court-circuite. C'est probablement assez rapide. – wim

0

La réponse de Wim est excellente et précise la manière correcte de corriger la compréhension.

Bien, je suggère d'utiliser une expression de générateur plutôt que d'une compréhension si le fichier texte d'entrée est très grand! Cela empêchera Python de charger le fichier entier en mémoire.

with open(<file>, "r") as fin: 
    generator = (line for line in fin if any(substr in line for substr in l1)) 
    for res in generator: 
     # Handle result found