python - 在保持串行读取的同时压缩一系列 JSON 对象?

标签 python json file-io compression zlib

我有一堆 json 对象 需要压缩,因为它占用了太多磁盘空间,大约 20 gigs 值(value)几百万。

理想情况下,我想做的是分别压缩每个文件,然后当我需要阅读它们时,只需反复加载和解压缩每个文件。我尝试通过 zlib 创建一个文本文件,每一行都是一个压缩的 json 对象 来做到这一点,但这失败了

由于流被截断导致解压缩错误,

我认为这是由于包含新行的压缩字符串。

有人知道这样做的好方法吗?

最佳答案

只需使用 gzip.GzipFile() object并将其视为普通文件;逐行写入 JSON 对象,并逐行读取它们。

该对象透明地负责压缩,并将缓冲读取,根据需要解压缩卡盘。

import gzip
import json

# writing
with gzip.GzipFile(jsonfilename, 'w') as outfile:
    for obj in objects:
        outfile.write(json.dumps(obj) + '\n')

# reading
with gzip.GzipFile(jsonfilename, 'r') as infile:
    for line in infile:
        obj = json.loads(line)
        # process obj

这还有一个额外的好处,即压缩算法可以利用对象的重复来提高压缩率。

关于python - 在保持串行读取的同时压缩一系列 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449625/

相关文章:

python - 在 Python 中打开和搜索 dBase III (DBF) 数据库

python - mongoengine 保存时操作错误

c - 如何解析json int数组?

javascript - 如何动态更改当前菜单元素AngularJS的标题(指令中的模板)

ruby-on-rails - rails : form_for with json: undefined method to_model for Hash

c - 从配置文件中读取

python - Ctrl+C 后 Pycharm 控制台崩溃

python - 使用 Flask-marshmallow 和 flask-restful 发布复杂对象

c++ - 一般处理文件流

java - 如何在java中读取文本文件并将行分配给变量