如何使用 Python 读取 json.gz 文件?

How to read a json.gz file using Python?

编辑:我已经在 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。很长一段时间以来,我一直被这个看似简单的问题所困扰,并且尝试了一切感觉。谁能帮忙?谢谢。

正如文档告诉您的那样,gzip.open() returns 默认情况下是一个二进制文件句柄。传入 rt 模式以将数据读取为文本:

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

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

如果您的输入文件在不同的行(称为“JSON 行”或“JSONS”)中包含多条 JSON 记录,其中每条记录都是单独的有效 JSON 结构,jq 可以在没有任何额外选项的情况下处理,但是 Python 的 json 模块需要您更详细地指定您的要求,也许像这样:

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

你可以看看这个post: 似乎是同一个问题。 该代码应该有效:

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

需要的是读取模式和解码modified/specified

示例代码

import gzip

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