【问题标题】:Except Python codec errors?除了 Python 编解码器错误?
【发布时间】:2010-12-29 12:57:14
【问题描述】:
File "/usr/lib/python3.1/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 805: invalid start byte

嗨,我得到了这个例外。当我收到此异常时,如何捕获它并继续读取我的文件。

我的程序有一个循环,它逐行读取文本文件并尝试进行一些处理。但是,我遇到的某些文件可能不是文本文件,或者包含格式不正确的行(外语等)。我想忽略这些行。

以下不工作

for line in sys.stdin:
   if line != "":
      try:
         matched = re.match(searchstuff, line, re.IGNORECASE)
         print (matched)
      except UnicodeDecodeError, UnicodeEncodeError:
         continue

【问题讨论】:

  • Python 教程中有一个完整的CHAPTER专门 介绍错误和异常。在那里试试。 docs.python.org/tutorial/errors.html
  • 是的,我明白了。我不是在问 Python 是否具有与错误和异常相关的功能。我正在使用 try, except 语句,但这些编解码器解码错误没有得到例外,导致作业失败。
  • 请发布简短但未经编辑的代码。 ** 在你的代码中是字面意思吗?
  • phihag:不,他们不是。我只是想强调一下。现已移除
  • 你怎么知道你的 try 块甚至是错误发生的地方?

标签: python decode encode


【解决方案1】:

看看http://docs.python.org/py3k/library/codecs.html。当您打开编解码器流时,您可能想要使用附加参数errors='ignore'

在 Python 3 中,sys.stdin 默认以文本流形式打开(参见 http://docs.python.org/py3k/library/sys.html),并具有严格的错误检查。

您需要将其作为容错 utf-8 流重新打开。这样的事情会起作用:

sys.stdin = codecs.getreader('utf8')(sys.stdin.detach(), errors='ignore')

【讨论】:

  • 他运行的是 3.1,所以不是相当这个。
  • @Ignacio 好点,但答案是一样的 - 我修复了指向 py3k 文档的链接。
  • 不……完全。 codecs.open() 在 3.x 中并不真正需要,因为它的功能现在是 open() 的一部分。
  • 我没有调用 codec.open() 或 codec 模块中的任何函数。我认为它被 re.search() 调用了
  • 感谢 Ignacio,问题是因为 sys.stdin 在 py3k 中默认打开为一个容错的 utf-8 流。我已经修补了我的答案。
猜你喜欢
  • 2015-01-28
  • 2010-09-26
  • 2018-04-12
  • 2015-02-03
  • 2019-09-01
  • 2018-07-25
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多