读取 gzip 文件并写入文本文件

Read a gzip file and write into text file

如何读取其中包含 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 图片(前两行): enter image description here

如果日志内容已经是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 迭代 hugh JSON 结构。