python - 在 Python 中读取打印精美的 JSON
问题描述
假设我有一个文件,其内容如下:
{
"_id": 0,
"metadata": {
"feature1": "value1",
"feature2": "value2",
}
}
{
"_id": 1,
"metadata": {
"feature1": "value3",
"feature2": "value4",
}
}
它是通过漂亮地打印数据库的每个 JSON 行生成的(请注意,在每个 JSON“行”之间,没有逗号,即,}{
而不是},{
)。
如何解析这样的文件以读取它(希望在 Pandas 中)?
解决方案
恐怕你会发现没有神奇的内置方式。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)
推荐阅读
- django - Django 管理站点获取 id 以在 html 中显示
- visual-studio-code - 我可以在 VSCode 中将 URL 作为“文件”打开吗?
- javascript - 自动重启 node.js socket.io
- azure - Azure 存储资源管理器 - 无法列出资源
- ios - 使用 Swift 4 及更高版本对十六进制数进行排序
- typescript - 是否可以从“任何”类型推断类型?
- flutter - 如何防止水平溢出?
- jenkins - 如何为 Jenkins 流水线有效地开发 groovy 脚本?
- r - 有没有办法根据排名来捕获值的序列
- sql - Want month wise net amount and mandays in sql when a date range is selected fromdate to todate