2010-07-02 8 views
0

나는파이썬 구문 분석 파일

우리는 컴파일의 출력을 기록 몇 가지 큰 파일을 가지고 있고이 파일에 대해 테스트 할 오류 패턴의 부부가 말을 할 수있는 다음과 같은 시나리오에 대한 최선의 방법을 알 필요가 , 예를 들면. 오류 패턴

- : error: 
- : error [A-Z]*[\d ]* 
- [A-Z]*[\d]* [E\e|rror: 
- " Cannot open include file " 
- " Could not find " 
- "is not a member of" 
- "has not been declared" 

이 효율적이 될 것 알려줘 수 :

  • 목록에서 각 오류에 대한
  • GREP 파일을 몇 가지 변수에 덤프 파일을 닫습니다
  • 또는 각 오류에 대한 정규 표현식을 만들고 변수를 통해 구문 분석

감사합니다

+0

번호 (12 개 이상) –

답변

2

로그 파일이 큰 경우, 메모리에로드하는 것이 좋습니다되지 않을 수 있습니다. 당신이 운영하려고 다음 메모리에 엄청난 양의 데이터를 읽고있는대로이 정말 효율적으로되지 않을 것

def has_error(filename): 
    with file(filename, 'r') as logfile: 
     for line in logfile: 
      for regexp in MY_REGEXPS: 
       if regexp.search(line): 
        return True 
     return False 
0

로그 파일이 크다는 것을 감안할 때 오류를 확인하는 (더) 효율적인 방법은 한 번에 한 줄 씩 파일을 반복하고 패턴마다 각 줄을 검사하는 것입니다. 불필요하게 거대한 파일을 메모리에 보관하고 싶지는 않을 것입니다. 파이썬에서

,이 같은 아마 뭔가 :

err = re.compile(': error(?::| [A-Z]*[\d ]*)|[A-Z]*\d* [Ee]rror:|' + 
       '" (?:Cannot open include file|Could not find) "|' + 
       '"(?:is not a member of|has not been declared)"') 
with open('file.log') as f: 
    for line in f: 
     m = err.search(line) 
     if m is not None: 
      # this line indicates an error 

당신이 당신의 요구에 맞게 정규 표현식을 변경해야 할 수도 있지만. 다른 대안으로는 정적 문자열 목록을 사용하는 것입니다.

err_list = ['error', 'Cannot open include file', 'Could not find', 'is not a member of', 'has not been declared'] 

그냥 각 라인의 각 문자열을 검색 :

with open('file.log') as f: 
    for line in f: 
     if any(line.find(e) for e in err_list): 
      # this line indicates an error 
0

대신, 당신은 그들에 대해 예를 들어 라인으로 라인을, 모든 정규 표현식 및 테스트를 미리 컴파일 할 수 있습니다 그것. 엄청난 양의 메모리가 없다면, 아마 좋은 생각이 아닙니다.

대신 발전기 사용이 메모리에 전체 파일을로드하고, 당신이 그들을 요청으로 또한에만 일치를 생산하지의 이익을해야합니다

def parser(filename): 
    with open(filename, 'r') as f: # For use in python > 2.4 I *think*. 
     for line in f: 
      if anymatches(line): # or whatever you want to do to generate a 
       yield line  # true/false value 

- 당신이 첫 번째 N을 원한다면 정도 당신은 이것을 할 수 있습니다 :

for i, match in zip(xrange(N), parser('mylogfile')): 
    #do something with match