使用python 3以健壮的方式解析文件
我有一个日志文件,我需要逐行检查,显然它包含一些“坏字节”.我收到如下错误消息:
我已经能够将问题删除到包含以下行的文件“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()) 然后我从命令行运行:
完整的追溯是: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |