我有一个很大的json文件(大约11,600条记录),我试图使用ijson来解析它。然而,for循环因为一条错误的json记录而中断。有没有一种方法可以通过跳过该记录并使用ijson或任何其他python库来继续迭代?下面是代码片段。
try:
for row in ijson.items(json_file, 'rows.item'):
data = row
try:
super_df=dependency_latest_version(data, version)
except Exception as e:
print(e)
except ijson.common.IncompleteJSONError:
traceback.print_exc()
这将生成以下错误:
for row in ijson.items(json_file, 'rows.item'):
ijson.common.IncompleteJSONError: parse error: after array element, I expect ',' or ']'
dmeFilename":"README.md"}}":{"integrity":"sha512-204Fg2wwe1Q
(right here) ------^
我尝试逐行迭代json文件,然后使用json.loads(line),但它没有帮助,因为整个json文件被作为一行读取。还有其他替代方案吗?谢谢。
1条答案
按热度按时间bnlyeluc1#
有没有一种方法可以通过跳过该记录并使用ijson [...]继续迭代?
ijson
:不是。虽然对你来说很明显,在数组中的一个错误元素上,你应该跳转到 * 有 * 一个下一个元素,但对于底层解析器来说,这样的语句并不明显:如果有一个解析错误,你不知道从哪里开始修复。因为没有可用的修复,解析器不能对接下来的事情做任何进一步的假设,所以没有更多的概念存在下一个元素,或一个新对象,或任何东西,因为你处于无效状态。解析器唯一能做的就是给予。
在您的情况下,您得到的错误消息(由
yajl
库发出,ijson
内部使用)表示它期望,
或]
分别继续或结束一个没有正确继续或结束的元素列表(并且注意,这样的列表不一定是您正在迭代的列表,很难从原始问题中分辨出来,因为没有显示示例JSON文档)。你不能期望解析器自动处理错误,并“跳到下一个元素”,因为,就像前面提到的,解析器不能猜测流的其余部分应该是什么。还有其他选择吗?
虽然我维护
ijson
并且不知道其他库的具体情况,但我很确定它们都有类似的问题。你最好的办法是在文档生成的地方修复它。或者,如果你确切地知道你的问题在哪里,你可以在传递给ijson
之前“修补”文档;请https://github.com/ICRAR/ijson/issues/33#issuecomment-698266199https://github.com/ICRAR/ijson/issues/25#issuecomment-610214101注意,严格地说,你不是在给一个JSON文档,你正在处理一个看起来非常像JSON文档的文档。