2010-07-02 116 views
0

我需要知道下面的情況下,最好的辦法Python的解析文件

可以說,我們有記錄的編譯輸出一些巨大的文件,並有幾個錯誤模式,我要測試的此文件,例如。錯誤模式可能是

- : 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

No.(十二個) – 2010-07-02 19:59:19

回答

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

鑑於日誌文件很大,檢查錯誤的(更有效的)方法是一次遍歷文件一行,並根據模式檢查每行。您不希望在內存中佔用大量文件。

在Python,大概是這樣的:

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