Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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-打印错误消息所指向的行_Python_Json_String - Fatal编程技术网

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

Python-打印错误消息所指向的行,python,json,string,Python,Json,String,要加载json,我使用json.loads()方法和try/except块来获取失败时发生错误的位置 我收到错误,形式如下: 预期对象:第1行第14117248列(字符14117247) 我在问是否有办法获取此错误所指向的行/字符 python中有没有一种方法可以从字符串返回行X列Y?很可能没有。至少在python 2.7中是这样加载不提供任何自定义错误行为的方法 try: value, end = scan_once(s, end) except StopIteration:

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

我收到错误,形式如下:

预期对象:第1行第14117248列(字符14117247)
我在问是否有办法获取此错误所指向的行/字符


python中有没有一种方法可以从字符串返回
行X列Y

很可能没有。至少在python 2.7中是这样<代码>加载不提供任何自定义错误行为的方法

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

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

从Python 3.5开始,解码可以提高性能。此异常包含一些额外属性,请使用这些属性打印出一些上下文。我会把这个限制在一根小绳子上。示例输入字符串的第一行至少有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]
    print(err)
    print('... ' if start else '', snippet, ' ...' if stop < len(err.doc) else '', sep="")
    print('^'.rjust(21 if not start else 25))
在Python3.4及更早版本中,会引发
ValueError
异常。您可以分析消息(异常.args[0]值)以获取线索,但这需要手动进行字符串分析。看,;解析时反转其格式


但是,对于这个特定的情况(需要一个值),您需要3.4或更高版本才能获得一个行和列指示符;在3.4版本之前,模块所能做的最好的事情就是给你一条没有帮助的信息。

那是一条很长的线。当然你可以打印这个;在异常消息中有坐标;解析它,然后拆分字符串。但听起来好像字符串后面有逗号。啊!好的,你能给我解释一下第1行第14117248列是什么意思吗?还有,“尾随逗号”有什么错吗?感谢您的输入字符串包含行(由
\n
分隔)。第一行至少有14117247个字符。解析器希望在该位置之后的第14117248列处有另一个对象的开始。发生该错误的常见方式是在该位置之前有一个逗号,但在该位置之后没有新对象的开始<例如,代码>[0,]会在第4列显示错误,因为
]
不是一个新对象,而是列表的末尾。异常显示他们使用的是Python 3
json
模块,该模块包含此上下文。@MartijnPieters,这对我来说并不明显。没有给出异常类,但消息几乎相同。Python2错误消息只是无法解码JSON对象。将其与OP中给出的错误进行比较,您将看到该消息显然提供了更详细的信息。您不需要从输入中读取消息。只需捕获异常并解析
exception.args[0]
;但是您需要Python3.4才能使该消息包含任何有用的内容。或者升级到3.5并从额外属性中提取信息。2.7则不是这样。请看一下这里的源代码:也许这在3.5版之后有所改变,但是
err.doc[start,stop]
对我来说不起作用。我不得不在3.7中使用
err.doc[start:stop]
。@MarcelWilson:哦,是的,我的答案有点错。谢谢你的提醒!