我正在开发一个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
如何在处理行之前清理行的内容,或者在不让我的脚本崩溃的情况下忽略它们?
谢谢!
答案 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等。