处理包含奇怪字符的日志文件时避免错误

时间:2013-08-05 06:54:42

标签: python exception python-3.x character-encoding

我正在开发一个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

如何在处理行之前清理行的内容,或者在不让我的脚本崩溃的情况下忽略它们?

谢谢!

2 个答案:

答案 0 :(得分:3)

open接受errors选项。

  

errors是一个可选字符串,用于指定编码和解码的方式   要处理错误 - 这不能在二进制模式下使用。各种   标准错误处理程序可用,但任何错误处理   已经在codecs.register_error()中注册的名称也是   有效。标准名称是:

     
      如果存在编码错误,
  • 'strict'会引发ValueError异常。默认值None具有相同的效果。
  •   
  • '忽略'忽略错误。请注意,忽略编码错误可能会导致数据丢失。
  •   
  • 'replace'会在有错误数据的地方插入替换标记(例如'?')。
  •   
  • 'surrogateescape'将表示任何不正确的字节,作为Unicode专用区中的代码点,范围从U + DC80到U + DCFF。这些   私有代码点然后将被转回到相同的字节   编写数据时使用surrogateescape错误处理程序。这是   用于处理未知编码的文件。
  •   只有在写入文件时才支持
  • 'xmlcharrefreplace'。编码不支持的字符将替换为   适当的XML字符引用&amp; #nnn;。
  •   
  • 'backslashreplace'(也仅在编写时支持)用Python的反斜杠转义序列替换不支持的字符。
  •   

传递errors='ignore'以忽略编码错误。

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

答案 1 :(得分: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等。