【问题标题】:Comprising different compressing methods for JSON data in python3包含python3中JSON数据的不同压缩方法
【发布时间】:2017-06-01 11:18:17
【问题描述】:

所以,我想使用不同的压缩器来压缩我的 JSON 数据。我用它来压缩 JSON。

import gzip
import JSON

with gzip.GzipFile('2.json', 'r') as isfile:
    for line in isfile:
        obj = json.loads(line)

这会引发错误。

raise OSError('Not a gzipped file (%r)' % magic)

OSError: Not a gzipped file (b'[\n')

我也试过直接压缩使用。

zlib_data= zlib.compress(data)

这会引发错误。

return lz4.block.compress(*args, **kwargs)

TypeError: a bytes-like object is required, not 'list'

所以,基本上我想使用所有方法压缩 JSON,并计算不同方法的压缩时间。

【问题讨论】:

  • 2.json 是压缩文件吗? ` (b'[\n')` 在您陈述的错误中是什么意思?在您提到的下一次尝试中,data 是什么? (错误提示它是一个列表,需要一个类似字节的对象)
  • @doctorlove 不,2.json 是一个简单的 JSON 文件。下一个尝试数据就是这个。 with open('2.json') as json_data: data = json.load(json_data) 2.JSON 又是一个简单的 JSON 文件。
  • 鉴于您压缩和解压缩了一些 JSON,您能否说明如何创建这些文件?
  • @MSeifert 这是我从 Internet 下载的示例 JSON 文件。我应该发布结构吗?事情是因为它是一个简单的 JSON(文本),它应该压缩。有什么更好的方法?
  • 问题是我目前无法重现异常。因此,任何人都很难/不可能调试此问题。最好有一个重现问题的示例(无需从互联网下载任何内容)。

标签: python json compression gzip


【解决方案1】:

在 python2.7 上

这似乎是您的数据类型的问题

要压缩的数据应该是 'str' 类型

import gzip
import json
import lz4
import time

with gzip.GzipFile('data.gz','w') as fid_gz:
    with open('data.json','r') as fid_json:
        # get json as type dict
        json_dict = json.load(fid_json)
        # convert dict to str
        json_str = str(json_dict)
    # write string
    fid_gz.write(json_str)

# check well maded
with gzip.GzipFile('data.gz','r') as fid_gz :
    print(fid_gz.read())

即使gzip压缩

gzip.zlib.compress(json_str,9)

即使 lz4 压缩

lz4.block.compress(json_str)

时间检查将是

# set start time
st = time.time()
# calculate elasped time
print(time.time() - st)

在 python3.5 上

python2.7 和 python 3 的区别在于你要压缩的数据类型

要压缩的数据应该是通过 bytes() 的 'byte' 类型

制作 .gz 文件时

with gzip.GzipFile('data.gz','w') as fid_gz:
    with open('data.json','r') as fid_json:
        json_dict = json.load(fid_json)
        json_str = str(json_dict)
        # bytes(string, encoding)
        json_bytes = bytes(json_str,'utf8')
    fid_gz.write(json_bytes)

或者只是用 gzip.compress(data, compresslevel=9) 压缩

# 'data' takes bytes
gzip.compress(json_bytes)

或者只是用 zlib.compress(bytes, level=-1, /) 压缩

gzip.zlib.compress(json_bytes,9)

或者只是用 lz4.bloc.compress(source, compression=0) 压缩

# 'source' takes both 'str' and 'byte'
lz4.block.compress(json_str)
lz4.block.compress(json_bytes)

测量时间由您决定。

干杯

【讨论】:

  • gzip.zlib.compress(json_str,9) 中的“9”是什么我试过了,但它仍然给出错误。 gzip.zlib.compress(json_str,9) TypeError: a bytes-like object is required, not 'str'
  • 它是压缩级别,gzip.zlib.compress() compress(string[, level]) -- Returned compressed string 但是在python2.7上,我现在正在尝试python3
  • 那么为什么会出错。它似乎适用于 lz4.block.compress(json_str) 。看一次错误。压缩前是否必须将其转换为字符串?当我试图比较压缩所需的时间时。必须花费一些时间才能将其转换为字典,然后再转换为字符串。
  • 是的,压缩有效。但问题是,转换 JSON 是绝对强制性的,因为输出类型也是字节。其次,我不能测量gzip.compress(json_bytes) 的执行时间吗?非常感谢您的回答。
  • st = time.time() gzip.compress(json_bytes) print(time.time()-st) 这可能对你有帮助
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2022-10-04
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多