我有一个主要是ascii文件的文件,但有时会出现一些非ascii字符。我想解析这些文件并提取以某种方式标记的行。以前我用过sed,但现在我需要在python中做同样的事情。 (当然我仍然可以使用os.system,但我希望更方便)。
我正在关注。
p = re.compile(".*STATWAH ([0-9]*):([0-9]*):([0-9 ]*):([0-9 ]*) STATWAH.*")
f = open("capture_8_8_8__1_2_3.log", encoding="ascii")
fl = filter(lambda line: p.match(line), f)
len(list(fl))
在最后一行,我收到以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x81 in position 2227: ordinal not in range(128)
如果我从第二行删除编码参数,i。即使用默认编码,即utf-8,错误如下:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/codecs.py", line 313, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 2227: invalid start byte
请问我能在这里做些什么,除了从python中调用sed?
UPD。
感谢@Wooble,我找到了答案。
正确的代码如下:
p = re.compile(rb".*STATWAH ([0-9]*):([0-9]*):([0-9 ]*):([0-9 ]*) STATWAH.*")
f = open("capture_8_8_8__1_2_3.log", "rb")
fl = filter(lambda line: p.match(line), f)
len(list(fl))
我以二进制模式打开文件,并从二进制字符串表示中编译正则表达式。