【问题标题】:"trailing data" error when reading json to Pandas dataframe将 json 读取到 Pandas 数据帧时出现“尾随数据”错误
【发布时间】:2021-12-30 14:24:43
【问题描述】:

我有一个 Python 3.8.5 脚本,它从 API 获取 JSON,保存到磁盘,将 JSON 读取到 DF。它有效。

df = pd.io.json.read_json('json_file', orient='records')

我想尝试使用 IO 缓冲区,这样我就不必读取/写入磁盘,但我遇到了错误。代码是这样的:

from io import StringIO
io = StringIO()
json_out = []
# some code to append API results to json_out
json.dump(json_out, io)
df = pd.io.json.read_json(io.getvalue())

在最后一行我得到了错误

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\util\_decorators.py", line 199, in wrapper
    return func(*args, **kwargs)

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\util\_decorators.py", line 296, in wrapper
    return func(*args, **kwargs)

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\io\json\_json.py", line 618, in read_json
    result = json_reader.read()

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\io\json\_json.py", line 755, in read
    obj = self._get_object_parser(self.data)

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\io\json\_json.py", line 777, in _get_object_parser
    obj = FrameParser(json, **kwargs).parse()

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\io\json\_json.py", line 886, in parse
    self._parse_no_numpy()

  File "C:\Users\chap\Anaconda3\lib\site-packages\pandas\io\json\_json.py", line 1119, in _parse_no_numpy
    loads(json, precise_float=self.precise_float), dtype=None

ValueError: Trailing data

JSON 采用列表格式。所以这不是实际的 json,但当我写入磁盘时它看起来像这样:

json = [
      {"state": "North Dakota",
        "address": "123 30th st E #206",
        "account": "123"
    },
    {"state": "North Dakota",
        "address": "456 30th st E #206",
        "account": "456"
    }
    ]

鉴于它在第一种情况下工作(从磁盘写入/读取),我不知道如何排除故障。如何解决缓冲区中的问题?实际数据主要是文本,但有一些数字字段。

【问题讨论】:

    标签: json python-3.x pandas


    【解决方案1】:

    不知道你怎么了,这对我有用:

    import json
    import pandas as pd
    from io import StringIO
    
    json_out = [
        {"state": "North Dakota",
         "address": "123 30th st E #206",
         "account": "123"
         },
        {"state": "North Dakota",
         "address": "456 30th st E #206",
         "account": "456"
         }
    ]
    
    io = StringIO()
    json.dump(json_out, io)
    df = pd.io.json.read_json(io.getvalue())
    print(df)
    

    让我相信附加 API 数据的代码有问题...

    但是,如果您有字典列表,则不需要 IO 步骤。你可以这样做:

    pd.DataFrame(json_out)
    

    编辑:当我的 json 末尾有一个逗号时,我想我记得这个错误,如下所示:

    [
      {
        "hello":"world",
      },
    ]
    

    【讨论】:

    • 哦,我没试过 pd.DataFrame(json_out);这很简单,似乎有效。感谢您指出我错过的显而易见的事情。
    猜你喜欢
    • 2018-06-05
    • 2018-10-09
    • 2020-08-26
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多