【问题标题】:How to read a json.gz file using Python? [duplicate]如何使用 Python 读取 json.gz 文件? [复制]
【发布时间】:2022-07-07 12:33:37
【问题描述】:

编辑:我已经看到关于 SA 的所有问题,他们都给了我我在这里问的错误 - 请你把它打开以便我能得到一些帮助吗?

我有一个文件可以使用 Bash 非常简单地读取,如下所示: gzip -d -c my_file.json.gz | jq . 这确认它是有效的 JSON。但是当我尝试像这样使用 Python 阅读它时:

import json
import gzip
with gzip.open('my_file.json.gz') as f:
    data = f.read() # returns a byte string `b'`
json.loads(data)

我得到错误:

json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 1632)

但我知道它是来自我的 Bash 命令的有效 JSON。我已经被这个看似简单的问题困扰了很长时间,并且尝试了所有感觉。任何人都可以帮忙吗?谢谢。

【问题讨论】:

  • 如果即使您修复了二进制错误,您的问题仍然可以重现,请edit 这(可能修复红鲱鱼并)提供minimal reproducible example 与显示问题的数据。根据您提供的诊断信息,我们只能得出结论,Python 的 JSON 解析器比 jq 中的解析器更严格。特别是,jq 允许输入具有多个 JSON 结构,每个结构都位于单独的行上,但这不是有效的 JSON。
  • 我更新了另一个副本来解释那部分。

标签: python json gzip


【解决方案1】:

就像文档告诉你的那样,gzip.open() 默认返回一个二进制文件句柄。传入rt 模式以将数据读取为文本:

with gzip.open("my_file.json.gz", mode="rt") as f:
    data = f.read()

... 或单独.decode() 二进制数据(显然你必须知道或猜测它的编码)。

如果您的输入文件在不同的行中包含多个 JSON 记录(称为“JSON 行”或“JSONS”),其中每个记录分别是一个有效的 JSON 结构,jq 无需任何额外选项即可处理,但 Python 的 @987654327 @module 需要你更详细地指定你的需求,可能是这样的:

with gzip.open("my_file.json.gz", mode="rt") as f:
    data = [json.loads(line) for line in f]

【讨论】:

  • 谢谢@tripleee。您的解决方案解决了我的问题。结果(数据)是原始数据 json.gz 文件中的项目列表。就我而言,每一行都是一个字典,我可以轻松地将其转换为 Pandas 数据框。
【解决方案2】:

你可以看看这个帖子:https://stackoverflow.com/a/39451012/10642508 好像是同一个问题。 该代码应该可以工作:

with gzip.open(jsonfilename, 'r') as fin:
    data = json.loads(fin.read().decode('utf-8'))

【讨论】:

  • 请不要发布指向其他问题的链接作为答案。一旦您获得足够的声望,您就可以投票结束重复。
【解决方案3】:

需要修改/指定的是读取模式和解码

示例代码

import gzip

f=gzip.open('a.json.gz','rb')
file_content=f.read()
print(file_content.decode())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2021-04-08
    • 2019-12-13
    • 2019-11-28
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多