2013-08-05 39 views
0

我正在開發一個逐行分析日誌文件的Python 3腳本。 它需要的日誌文件分析作爲參數,並進行處理:處理包含奇怪字符的日誌文件時避免錯誤

parser = argparse.ArgumentParser(description="logfile analysis") 
    parser.add_argument("logfile", help="log file to analyse") 
    args = parser.parse_args() 
    with open(args.logfile, 'r') as f: 
     for line in f: 
      (... processing ...) 

然而,有時候,這些日誌文件包含了非常奇怪的字符。 我甚至不知道如何複製和粘貼在這裏這些字符,所以這裏是一個文本編輯器的截圖: Weird characters appearing in the logs

而且在這種情況下,我有以下異常:

Traceback (most recent call last): 
    File "loganalysis.py", line 525, in <module> 
    main() 
    File "loganalysis.py", line 512, in main 
    for line in f: 
    File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 2265: invalid start byte 

我如何在處理它們之前清理這些行的內容,或者在沒有腳本崩潰的情況下忽略它們?

謝謝!

回答

3

open接受errors選項。

錯誤是一個可選字符串,指定如何處理編碼和解碼錯誤 - 這不能用於二進制模式。標準錯誤處理程序的各種 都可用,儘管任何使用codecs.register_error()註冊的錯誤處理 也是 有效。標準名稱是:

  • 如果存在編碼錯誤,'strict'會引發ValueError異常。 None的默認值具有相同的效果。
  • '忽略'忽略錯誤。請注意,忽略編碼錯誤可能會導致數據丟失。
  • 'replace'會導致替換標記(例如'?')插入存在格式錯誤的數據的地方。
  • 'surrogateescape'將任何不正確的字節表示爲Unicode專用區域中的代碼點,範圍從U + DC80到U + DCFF。這些 專用代碼點將在編寫數據時使用surrogateescape錯誤處理程序時使用 而被重新轉換爲相同的字節。這是用於處理未知編碼文件的 。
  • 'xmlcharrefreplace'僅在寫入文件時受支持。編碼不支持的字符將替換爲 適當的XML字符引用& #nnn ;.
  • 'backslashreplace'(也只在寫入時才支持)用Python的反斜槓轉義序列替換不支持的字符。

通行證errors='ignore'忽略編碼錯誤。

open(args.logfile, 'r', errors='ignore') 
+0

謝謝!看起來像它解決了我的問題:) – Pierre

0

處理之前,你可以隨時消毒字符串,例如:

parser = argparse.ArgumentParser(description="logfile analysis") 
parser.add_argument("logfile", help="log file to analyse") 
args = parser.parse_args() 
with open(args.logfile, 'r') as f: 
    for line in f: 
     line = repr(line) 
     (... processing ...) 

這將導致以表示爲\ XC0任何特殊字符線等

+0

謝謝史蒂夫,問題是異常是在「在f:行」,而不是在後。 – Pierre

相關問題