2017-10-20 213 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 
相關問題