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 ...)

但是,有时日志文件包含非常奇怪的字符。我什至不知道如何在这里复制和粘贴这些字符,所以这里是文本编辑器的屏幕截图: 日志中出现奇怪的字符

在这些情况下,我有以下例外:

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

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

谢谢!

4

2 回答 2

3

打开接受errors选项。

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

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

通过errors='ignore'忽略编码错误。

open(args.logfile, 'r', errors='ignore')
于 2013-08-05T06:59:36.000 回答
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 等的特殊字符。

于 2013-08-05T06:59:45.683 回答