首页 > 解决方案 > 在 Python 中读取打印精美的 JSON

问题描述

假设我有一个文件,其内容如下:

{
    "_id": 0,
    "metadata": {
        "feature1": "value1",
        "feature2": "value2",
    }
}
{
    "_id": 1,
    "metadata": {
        "feature1": "value3",
        "feature2": "value4",
    }
}

它是通过漂亮地打印数据库的每个 JSON 行生成的(请注意,在每个 JSON“行”之间,没有逗号,即,}{而不是},{)。

如何解析这样的文件以读取它(希望在 Pandas 中)?

标签: pythonjsonpandas

解决方案


恐怕你会发现没有神奇的内置方式。JSON 格式被指定为包含一个对象,即使该对象可以是一个列表。

一种称为 JSONL 的变体允许每行一个对象。标准 Python 库 json 模块不接受此变体,但 Pandas 接受此变体read_json。不幸的是,这个变体不允许多行对象。

但是您的数据更糟糕,它,在最后一个字段之后包含逗号 ()(在右大括号 () 之前的逗号})被所有 JSON 处理器拒绝。

这意味着您将不得不预处理您的数据:

import re
import pandas as pd

with open('garbage_file.json') as fd:
    data = fd.read()       # loads everything in a multiple poorly formatted json string

data = re.sub(r'(?<!\n})\n', ' ', data)  # remove newlines unless preceded with a single } character
data = re.sub(r',\s*}', '}', data)       # remove offending comma before }

# ok, data should now be a correct JSONL string
df = pd.read_json(data, lines=True)

推荐阅读