【问题标题】:Read a gzip file and write into text file读取 gzip 文件并写入文本文件
【发布时间】:2021-11-25 21:30:04
【问题描述】:

如何读取包含 JSON 内容的 gzip 文件,然后将该内容写入文本文件。

with open('.../notebooks/decompressed.txt', 'wb') as f_out:
    with gzip.open(".../2020-04/statuses.log.2020-04-01-00.gz", 'rb') as f_in:
        data = f_in.read()
        json.dumps(data)

错误:字节类型的对象不是 JSON 可序列化的

decompressed.txt 图像(前 2 行): enter image description here

【问题讨论】:

  • 我对此并不陌生。我尝试了不同的代码,如 json.dump(data,f_out) 等,但没有任何效果。
  • 是否已验证 gzip 压缩文件是单个 JSON 序列化文件,以 '[' 和 ']' 或 '{' 和 '}' 开头和结尾??
  • 该文件包含 twitter 数据,其结构如下: { "a":value,"b":value} { "a":value,"b":value} { "a":value, “b”:值}
  • 您将使用json.loads,而不是json.dumps 将JSON 输入转换为结构。但是,如果您将其写回文件,则需要再次重新序列化它。所以看起来您需要做的就是将data 写入您的输出文件,而根本不使用json

标签: python json gzip


【解决方案1】:

如果日志内容已经是json序列化格式,则只需将解压后的数据原样写入即可。

import gzip
with gzip.open('.../2020-04/statuses.log.2020-04-01-00.gz', 'rb') as fin:
    with open('.../notebooks/decompressed.txt', 'wb') as fout:
        data = fin.read()
        fout.write(data)

如果文件很大,则导入shutil模块并将read()和write()替换为:

shutil.copyfileobj(fin, fout)

如果想将 JSON 加载到对象中并重新序列化:

import gzip
import json

with gzip.open('.../2020-04/statuses.log.2020-04-01-00.gz', 'rb') as fin:
    with open('.../notebooks/decompressed.txt', 'w') as fout:
       obj = json.load(fin)
       json.dump(obj, fout)

如果日志文件是一系列 JSON 结构,每行一个,则尝试:

import gzip
with gzip.open('.../2020-04/statuses.log.2020-04-01-00.gz', 'rb') as fin:
    for line in fin:
        obj = json.loads(line)
        # next do something with obj

如果 JSON 太大而无法反序列化,请尝试使用 ijson 迭代巨大的 JSON 结构。

【讨论】:

  • f_out.write(data) 给出错误:需要一个类似字节的对象,而不是 'str'
  • 更新了答案中的代码。如果使用 fin.read().decode() 则在输出中对字符串内容使用“w”模式,否则对数据输入不使用 decode(),对二进制数据在输出中使用“wb”。
  • 更新的代码给出了这个错误:额外数据:第 2 行第 1 列(char 1994)在第 obj = json.loads(json_data) 行
  • 如果我使用 shutil.copyfileobj(f_in, f_out) 那么在读取文件时如何加载 JSON 对象?
  • 如果 json.loads(json_data) 失败,则数据不是有效的 JSON。需要打印数据看看是什么。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
相关资源
最近更新 更多