【问题标题】:Error while reading JSON file in chunksizes with python使用python读取块大小的JSON文件时出错
【发布时间】:2021-10-22 12:51:50
【问题描述】:

我有一个很大的 json 文件,所以我想在测试时分块读取文件。我已经实现了以下代码:

if fpath.endswith('.json'):
    with open(fpath, 'r') as f:
        read_query = pd.read_json(f, lines=True, chunksize=100)
        
        for chunk in read_query:
            print(chunk)

我得到错误:

 File "nameoffile.py", line 168, in read_queries_func
    for chunk in read_query:
  File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 798, in __next__
    obj = self._get_object_parser(lines_json)
  File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 770, in _get_object_parser
    obj = FrameParser(json, **kwargs).parse()
  File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 885, in parse
    self._parse_no_numpy()
  File "C:\Users\Me\Python38\lib\site-packages\pandas\io\json\_json.py", line 1159, in _parse_no_numpy
    loads(json, precise_float=self.precise_float), dtype=None
ValueError: Expected object or value 

为什么会出现错误?

JSON 文件如下所示:

[
  {
    "a": "13", 
    "b": "55"
  }, 
  {
    "a": "15", 
    "b": "16"
  }, 
  {
    "a": "18", 
    "b": "45"
  }, 

  {
    "a": "1650", 
    "b": "26"
  }, 
       .
       .
       .
  {
    "a": "214", 
    "b": "23"
  }
]

另外,有没有办法在读取文件时只提取“a”属性的值?还是只能在我阅读完文件后才能完成?

【问题讨论】:

  • 你可以看看我的回答,看看what to do when someone answers。当然,如果它没有回答您的问题,您可以发表评论,我们会从那里解决。

标签: json python-3.x pandas dataframe compiler-errors


【解决方案1】:

您的 json 文件只包含一个对象。根据the doc of the chunksize argument指向的line-delimited json doc

pandas 能够读取和写入行分隔的 json 文件,这些文件在使用 Hadoop 或 Spark 的数据处理管道中很常见。

对于以行分隔的 json 文件,pandas 还可以返回一个迭代器,它一次读取块大小的行。这对于大文件或从流中读取很有用。

这也意味着lines=True,并且行的文档说:

将文件作为每行的 json 对象读取。

这意味着像这样的文件可以工作:

{"a": 1, "b": 2}
{"a": 3, "b": 4}
{"a": 5, "b": 6}
{"a": 7, "b": 8}
{"a": 9, "b": 10}

这些不是:

[
{"a": 1, "b": 2},
{"a": 3, "b": 4},
{"a": 5, "b": 6},
{"a": 7, "b": 8},
{"a": 9, "b": 10}
]

因此,您必须一次性读取文件,或者在执行过程中对其进行修改以使每行有一个对象。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 2020-10-11
    • 2018-08-18
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多