python - 提取我的 .json.gz 文件时,会添加一些字符 - 并且该文件无法存储为 json 文件

标签 python json gzip jsonlines

我正在尝试解压缩一些 .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'吗?这个压缩文件有数百万个,我无法手动执行此操作。

我在以下链接中上传了这些文件的示例 just a few json.gz files

最佳答案

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

沙丘的answerquestion @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 可能是什么样子。

关于python - 提取我的 .json.gz 文件时,会添加一些字符 - 并且该文件无法存储为 json 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54725683/

相关文章:

python - 是否可以与/dev/bus/usb/<bus>/<device> 进行串行通信

ios - json 解析时无法使用 Codable Concept swift 4 管理 nil

java - 如何将字符串转换为java列表?

android - Android使用带有列表 Activity 的JSON强制关闭并显示错误

node.js - Express:提供预压缩的静态资源

python - 从 pandas 中的逗号分隔字符串列中删除重复条目

python - 如何使用 Django 查询检查数据库字段的所有值是否相同

python - 在 Python 中求解数学方程的最简单方法

c# - Gzip压缩asp.net c#

performance - 如何压缩 CouchDB 的 HTTP 响应中的 JSON 内容?