[英]Python 3 itertools.islice continue despite UnicodeDecodeError
我有一个监视日志文件的 python 3 程序。 日志包括用户编写的聊天消息等。 该日志是由我无法更改的第三方应用程序创建的。
今天有用户写了“텋 텋 ”,导致程序崩溃,报错如下:
future: <Task finished coro=<updateConsoleLog() done, defined at /usr/local/src/bserver/logmonitor.py:48> exception=UnicodeDecodeError('utf-8',...
say "\xed\xa0\xbd\xed\xb1\x8c"\r\n', 7623, 7624, 'invalid continuation byte')>
Traceback (most recent call last):
File "/usr/lib/python3.4/asyncio/tasks.py", line 238, in _step
result = next(coro)
File "/usr/local/src/bserver/logmonitor.py", line 50, in updateConsoleLog
server_events = self.console.getUpdate()
File "/usr/local/src/bserver/console.py", line 79, in getUpdate
return self.read()
File "/usr/local/src/bserver/console.py", line 90, in read
for line in itertools.islice(log_file, log_no, None):
File "/usr/lib/python3.4/codecs.py", line 319, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 7623: invalid continuation byte
ERROR:asyncio:Task exception was never retrieved
使用 'file -i log.file' 我确定日志文件是 us-ascii。 这不应该,因为 ascii 是 utf-8 的子集(据我所知)。
由于这种情况很少发生,而且我不介意丢失该用户输入的任何内容,我是否可以忽略此行或无法解码的特定字符并继续阅读文件的其余部分?
我考虑过使用try: ... except UnicodeDecodeError as ...
,但这意味着我无法在错误发生后读取日志文件中的任何内容。
代码
def read(self):
log_no = self.last_log_no
log_file = open(self.path, 'r')
server_events = []
starting_log_no = log_no
for line in itertools.islice(log_file, log_no, None): //ERROR
server_events.append(line)
print(line.replace('\n', '').replace('\r', ''))
log_no += 1
self.last_log_no = log_no
if (starting_log_no < log_no):
return server_events
return False
任何帮助或建议将不胜感激!
字节串\\xed\\xa0\\xbd\\xed\\xb1\\x8c
不是utf-8
有效的。 也不是us-ascii
,因为us-ascii
只能是 7 位长; 即\\x8c
大于 127。
不要忽略UnicodeDecodeError
,而是尝试使用支持所有 8 位字节的编码(例如latin-1
)打开文件:
log_file = open(self.path, 'r' encoding='latin-1')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.