Pandas read_json() 使用简单的 JSON 字符串失败

Posted

技术标签:

【中文标题】Pandas read_json() 使用简单的 JSON 字符串失败【英文标题】:Pandas read_json() fails with a simple JSON string 【发布时间】:2018-07-13 13:32:24 【问题描述】:

我正在尝试从 json 字符串(不是文件)创建 DataFrame 对象:

json_string = "['code': '8', 'name': 'Human', 'code': '11', 'name': 'Orc']"
df = pd.read_json(json_string)

但是这种方法会导致以下错误:

ValueError: Expected object or value

documentation 听起来像是可能的:

pandas.read_json(path_or_buf=None, orient=None, typ='frame', dtype=True, convert_axes=True, convert_dates=True, keep_default_dates=True, numpy=False ,precision_float=False,date_unit=None,encoding=None,lines=False,chunksize=None,compression='infer')

将 JSON 字符串转换为 pandas 对象

path_or_buf:有效的 JSON 字符串或类似文件,默认值: 该字符串可以是一个 URL。有效的 URL 方案包括 http、ftp、s3 和文件。对于文件 URL,需要一个主机。例如,本地文件可以是 file://localhost/path/to/table.json

我已经尝试使用orient 的几种组合调用该方法,但均未成功。关于如何做到这一点的任何提示?

我真的不希望将我的字符串保存到文件的开销能够成功使用read_json()

【问题讨论】:

JSON 对象 keysvalues 应该用双引号括起来而不是单引号。 我知道,如果我能改变它,我会的。但在这种情况下是no-can't-do 然后使用eval将其转换为list of dict @karlphillip,如果你不能改变引号,你可以在读取json之前至少添加一个预处理行吗? json_string = json_string.replace('\'', '\"') 【参考方案1】:

您可以使用eval 将字符串评估为dict,然后直接传递给DataFrame 构造函数。

>>> import pandas as pd
>>> pd.DataFrame(eval("['code': '8', 'name': 'Human', 'code': '11', 'name': 'Orc']"))

    code   name
0   8      Human
1   11     Orc

同样,您也可以使用ast.literal_eval 代替eval

>>> import ast
>>> pd.DataFrame(ast.literal_eval("['code': '8', 'name': 'Human', 'code': '11', 'name': 'Orc']"))

    code   name
0   8      Human
1   11     Orc

【讨论】:

比较 eval('print("delete root")')ast.literal_eval('print("delete root")')。我会坚持第二个选项。

以上是关于Pandas read_json() 使用简单的 JSON 字符串失败的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas 中使用 read_json 导入单个记录

使用 pandas.read_json 时出现 ValueError

在 Pandas UnicodeDecodeError 中无法使用 pandas.read_json() 解码 JSON 文件中的 Unicode Ascii

如何让 pandas.read_json 将此 API 返回识别为有效的 .json?

如何使用 pandas read_json 读取 ADSB json 数据? [复制]

Pandas.read_json(JSON_URL)