加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用python 3以健壮的方式解析文件

发布时间:2020-12-20 12:06:56 所属栏目:Python 来源:网络整理
导读:我有一个日志文件,我需要逐行检查,显然它包含一些“坏字节”.我收到如下错误消息: UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb0 in position 9: invalid start byte 我已经能够将问题删除到包含以下行的文件“log.test”: Message: 260
我有一个日志文件,我需要逐行检查,显然它包含一些“坏字节”.我收到如下错误消息:

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb0 in position 9: invalid start byte

我已经能够将问题删除到包含以下行的文件“log.test”:

Message: 260

(至少这是它在我的Emacs中的显示方式.)

我有一个文件“demo_error.py”,如下所示:

import sys
with open(sys.argv[1],'r') as lf:
    for i,l in enumerate(lf):
        print(i,l.strip())

然后我从命令行运行:

$python3 demo_error.py log.test

完整的追溯是:

Traceback (most recent call last):
  File "demo_error.py",line 5,in <module>
    for i,l in enumerate(lf):
  File     "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/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 0xb0 in position 13: invalid start byte

我的预感是我必须以某种方式指定一个更通用的编解码器(例如“raw ascii”) – 但我不太确定如何做到这一点.

请注意,这在Python 2.7中确实不是问题.

只是为了明确我的观点:我不介意对相关的行进行例外处理 – 然后我可以简单地丢弃该行.问题是异常似乎发生在“for”循环本身上,这使得对该特定行的特殊处理变得不可能.

解决方法

您也可以使用 codecs模块.使用codecs.open()函数时,可以使用errors参数指定它如何处理错误:

codecs.open(filename,mode[,encoding[,errors[,buffering]]])

errors参数可以是几个不同的关键字之一,它们指定Python在尝试解码对当前编码无效的字符时的行为方式.您可能最感兴趣的是codecs.ignore_errors或codecs.replace_errors,它们会导致无效字符被忽略或被默认字符替换.

当您知道有损坏的数据时,即使您指定了正确的编码,也会引发UnicodeDecodeError,此方法可能是一个不错的选择.

例:

with codecs.open('file.txt',mode='r',errors='ignore'):
    # ...stuff...
    # Even if there is corrupt data and invalid characters for the default
    # encoding,this open() will still succeed

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读