2017-10-20 7 views
1

특정 발생에 대한 로그 파일을 구문 분석하려고합니다. 로그 파일이 커질 수 있기 때문에 우리가 필요로하는 어플리케이션에 관심이없는 라인을 걸러 낼 필요가 있습니다. 아이디어는 내가 찾고자하는 4 개 또는 5 개의 문자열로 하나의 목록을 만든 다음 로그 파일이 보존 된 행을 포함하는 다른 목록의 행 위로 반복하는 것입니다.목록의 요소가 파이썬 목록의 요소에 있는지 확인하십시오.

로그 파일은 프록시의 로그이며 요청이 어디에서 왔는지 뷰를 얻는 데 사용됩니다 줄에서 "찾기/찾기"를 찾으면 첫 번째 줄이기가 쉬워요. 그 안에.

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'의 각 구성원에 대한 큰 목록 줄을 반복하지 않아도 작동 할 수있는 방법이 있습니까? 당신은 이것에 대한 정규식을 사용하는 것이 좋습니다,

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

또는 :

+0

l1에는 4 개 또는 5 개의 문자열 만 있고 중복되지 않습니다. 기본적으로 모두 다른 언어로 동일합니다. 그것을 세트로 바꾸는 것의 개선점은 무엇입니까? – Erwin

+0

만약 당신이 wim의 대답을 사용하고 있다면, (나는 다소 질문을 잘못 읽었습니다.) 요점은 없습니다. –

답변

2

당신은 내장 함수 any을 사용할 수 있습니다.

+0

이것은 복잡하지만 3 차입니다. –

+0

부분 문자열 검사는 많이 최적화되어 있으며'any'는 단락되어 있습니다. 아마도 충분히 빠를 것입니다. – wim

0

윔의 대답은 훌륭하고 정확한 이해 방법을 지정합니다.

입력 텍스트 파일이 매우 크면 이해력보다는 생성기 표현을 사용하는 것이 좋습니다. 파이썬이 전체 파일을 메모리에로드하지 못하도록합니다.

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