1

我正在尝试解析和筛选一个非常大的 JSON 文件,其中包含 9gb 大小的推文元数据。这就是我使用 ijson 的原因,因为这是社区最推荐的此类文件。它仍然很新,但我装配了这个函数,它应该根据某些条件将值存储到列表中。在遍历不同的 JSON 时,它向我显示以下错误:

parse error: unallowed token at this point in JSON text
          sitive": false, "lang": "en"},  {"created_at": "Thu Mar 19 1
                     (right here) ------^

我不确定我需要改变什么才能让它工作。在使用 Twarc 库对推文进行水合后,我得到了这个文件。我在下面附上了我的示例代码。有没有人遇到过这种情况?

示例代码:

import ijson

with open(march_20_tweets_path, 'rb') as input_file:
          jsonobj = ijson.items(input_file, 'item', multiple_values=True)
          jsons = (o for o in jsonobj if o['place'] is not None) #error shows here
          for tweet in jsons:
                   #extracting and storing values
4

1 回答 1

1

这可能是(但不一定!)错误编写的“行分隔”JSON 文件。(yajl 起源,仅由 ijson 显示)错误消息不一定显示原始字符,因此无法立即看出错误的真正原因是什么。

但是,这很容易通过一个小示例重现(ijson.dump仅在masterijson 版本上可用,尚未发布到 PyPI 上):

$> echo '0,1' | python -m ijson.dump -M
[...]
ijson.common.IncompleteJSONError: parse error: unallowed token at this point in JSON text
                                      0,1 
                     (right here) ------^

这里有两个顶级 JSON 文档,由单个值01. 但是,逗号不属于任何一个文档,因此不允许使用令牌(即逗号)。

一个更相关的例子:

$> echo '{},{}' | python -m ijson.dump -M
[...]
ijson.common.IncompleteJSONError: parse error: unallowed token at this point in JSON text
                                     {}, {} 
                     (right here) ------^

如果在两者之间添加新行:

$> echo -e '{},\n\n{}' | python -m ijson.dump -M
[...]
ijson.common.IncompleteJSONError: parse error: unallowed token at this point in JSON text
                                     {},  {} 
                     (right here) ------^

去掉逗号就没有问题了:

$> echo -e '{}\n\n{}' | python -m ijson.dump -M
#: name, value
--------------
0: start_map, None
1: end_map, None
2: start_map, None
3: end_map, None

总之:

  • 很可能“行分隔” JSON 文件不仅由换行符分隔,而且在顶级对象之间也有逗号。
  • 如果确实如此,您可以使用类似sed或类似的工具来删除文件中的尾随逗号。您甚至可以在命令管道中执行此操作,以避免将结果写回磁盘,sed 's/\(.*\),\s*/\1/' input.json | python your-script.py例如your-script.pysys.stdin.buffer.
  • 我可能完全错了,不允许的令牌的来源在其他地方。
于 2021-06-25T14:26:01.577 回答