1

我正在尝试解压缩一些.json.gz文件,但gzip向其中添加了一些字符,因此使其对 JSON 不可读。

您认为是什么问题,我该如何解决?

如果我使用7zip等解压软件解压文件,这个问题就消失了。

这是我的代码:

with gzip.open('filename' , 'rb') as f:
    json_content = json.loads(f.read())

这是我得到的错误:

Exception has occurred: json.decoder.JSONDecodeError
Extra data: line 2 column 1 (char 1585)

我使用了这段代码:

with gzip.open ('filename', mode='rb') as f:
    print(f.read())

并意识到文件以b'(如下所示)开头:

b'{"id":"tag:search.twitter.com,2005:5667817","objectType":"activity"

我认为b'这是使该文件无法用于下一阶段的原因。你有什么办法可以去掉b'?这个压缩文件有数百万个,我不能手动这样做。

我在以下链接中上传了这些文件的示例, 只是几个 json.gz 文件

4

1 回答 1

3

问题不在于b您看到的那个前缀print(f.read()),它只是意味着数据是一个bytes序列(即整数 ASCII 值)而不是 UTF-8 字符序列(即常规 Python 字符串)——json.loads()两者都可以接受。这JSONDecodeError是因为 gzip 文件中的数据不是有效的JSON 格式,这必需的。这种格式看起来像JSON Lines —— Python 标准库json模块不(直接)支持。

Dunes 对@Charles Duffy 问题的回答将这一点标记为 - 由于此格式问题,因此无法正常工作但是,从您在问题中添加链接的示例文件中,看起来文件的每一都有一个有效的 JSON 对象。如果您的所有文件都是这样,那么一个简单的解决方法是逐行处理每个文件。

这就是我的意思:

import json
import gzip


filename = '00_activities.json.gz'  # Sample file.

json_content = []
with gzip.open(filename , 'rb') as gzip_file:
    for line in gzip_file:  # Read one line.
        line = line.rstrip()
        if line:  # Any JSON data on it?
            obj = json.loads(line)
            json_content.append(obj)

print(json.dumps(json_content, indent=4))  # Pretty-print data parsed.    

请注意,它打印的输出显示了有效 JSON 的样子。

于 2019-02-17T16:30:28.573 回答