Python - 打印错误消息指向的行

时间:2016-02-02 10:17:01

标签: python json string

要加载json,我使用带有json.loads()块的try/except方法来获取失败时发生错误的位置。

我收到错误,格式为:

Expecting object: line 1 column 14117248 (char 14117247)

我问是否有办法让这个错误指向行/字符。

python中是否有一种从字符串返回line X column Y的方法?

2 个答案:

答案 0 :(得分:2)

最有可能的,没有。至少在Python 2.7中。 loads没有提供任何方法来自定义错误的行为方式。

try:
    value, end = scan_once(s, end)
except StopIteration:
    raise ValueError(errmsg("Expecting object", s, end))

但您可以从错误消息中解析位置以从输入中读取该行。错误格式可以是{0}: line {1} column {2} (char {3}){0}: line {1} column {2} - line {3} column {4} (char {5} - {6})

答案 1 :(得分:2)

从Python 3.5开始,解码可以提升JSONDecodeError exception。此异常包含一些额外属性,使用这些属性打印出一些上下文。我将此限制为一个小字符串。您的示例输入字符串在第一行至少有14117247个字符,可能是因为您的输入根本不包含行分隔符;打印所有这些字符可能没有任何帮助:

import json

try:
    json.loads(some_string)
except json.JSONDecodeError as err:
    # grab a reasonable section, say 40 characters.
    start, stop = max(0, err.pos - 20), err.pos + 20
    snippet = err.doc[start, stop]
    if err.pos < 20:
        snippet = '... ' + snippet
    if err.pos + 20 < len(err.doc):
        snippet += ' ...'
    print(err)
    print(snippet)

在Python 3.4及更早版本中,引发了ValueError异常。您可以解析消息exception.args[0]值)以获取线索,但这需要手动字符串解析。见errmsg() function;解析时反转其格式。

对于这种特殊情况(预计会有值),您需要3.4或更新才能获得行和列指示符;在3.4之前,模块可以做的最好的事情是给你无益的消息No JSON object could be decoded