Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获取发生UnicodeDecodeError的位置?_Python_Python 3.x_Exception_Exception Handling - Fatal编程技术网

Python 如何获取发生UnicodeDecodeError的位置?

Python 如何获取发生UnicodeDecodeError的位置?,python,python-3.x,exception,exception-handling,Python,Python 3.x,Exception,Exception Handling,我如何知道UnicodeDecodeError发生在哪里? 我发现材料已过,并试图在下面实施它。但是我刚刚得到一个错误namererror:name'err'没有定义 我在StackOverflow上搜索了整个互联网,但找不到任何关于如何使用它的提示。在python文档中,它说这个特殊的异常具有start属性,所以它必须是可能的 多谢各位 data = buffer + data try: data = data.decode("utf-8") excep

我如何知道UnicodeDecodeError发生在哪里? 我发现材料已过,并试图在下面实施它。但是我刚刚得到一个错误
namererror:name'err'没有定义

我在StackOverflow上搜索了整个互联网,但找不到任何关于如何使用它的提示。在python文档中,它说这个特殊的异常具有start属性,所以它必须是可能的

多谢各位

    data = buffer + data
    try:
        data = data.decode("utf-8")
    except UnicodeDecodeError:
        #identify where did the error occure?
        #chunk that piece off -> copy troubled piece into buffer and 
        #decode the good one -> then go back, receive the next chunk of 
        #data and concatenate it to the buffer.

        buffer = err.data[err.start:]
        data = data[0:err.start]
        data = data.decode("utf-8")

该信息存储在异常本身中。您可以使用
作为
关键字获取异常对象,并使用
开始
属性:

while True:
    try:
        data = data.decode("utf-8")
    except UnicodeDecodeError as e:
        data = data[:e.start] + data[e.end:]
    else:
        break

如果您只想忽略错误并解码其余错误,您可以执行以下操作:

data = data.decode("utf-8", errors='ignore')

投票决定以微不足道的方式结束,因为答案是一个重要的语法细节。可能对将来的参考仍然有用。这很简单。非常感谢:)在文档中他们说:“例如,err.object[err.start:err.end]给出了编解码器失败的特定无效输入。”这是什么意思:err.object[err.start:err.end]?这和e.start不一样,甚至不接近。@Cooper:接得好!我应该编辑我的答案。事实上,很接近。这是一个很好的例子。这意味着在位置
err.start
err.end
之间获取所有字符。这包括
err.start
,但不包括
err.end
。在大多数情况下,结束仅在开始后一个字符,因此我的解决方案将起作用。然而,我相信在某些情况下,
err.end
比err.object高出一个以上。在err.object中,object实际上是某个属性。明白了,谢谢:)