2017-10-20 163 views
1

我试图解析某些事件的日志文件。由于日志文件可能很安静,因此有必要过滤掉我们需要的应用程序不感兴趣的行。 这个想法是,我用4或5个字符串创建一个我想查找的列表,然后在包含我保留的日志文件的行的其他列表中循环遍历行。检查列表中的元素是否存在于python列表的元素中

日志文件是代理的日志,用于获取请求来自哪里的视图 通过在行中查找“GET /”,并且只存储那些确实存在在里面。

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

列表,然后“行”需要被降低到包含数字的字符串之一

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

我试过列表理解,但没有工作的URL行:

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

有没有办法让这个工作,而不必在'l1'的每个成员循环大列表行?

+0

l1中只有4或5个字符串,没有重叠,基本上它们在不同的语言中都是相同的。将它变成一个集合会有什么改进? – Erwin

+0

如果你使用wim的答案,那没有意义(我有点误解了这个问题)。 –

回答

2

您可以使用内置的功能any

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

或者,你可以考虑使用正则表达式这一点。

+0

虽然这是复杂的立方体。 –

+0

子串检查经过了大量优化,“any”短路。它可能够快。 – wim

0

Wim的回答非常好,并确定了修正理解的正确方法。

虽然,如果输入的文本文件非常大,我会建议使用生成器表达式而不是理解。 这会阻止Python将整个文件加载到内存中。

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 
相关问题