【问题标题】:Is there a way to use `json.dump` with `gzip`?有没有办法将 json.dump 与 gzip 一起使用?
【发布时间】:2018-09-07 03:53:23
【问题描述】:

Here 是关于如何使用json.dumps 写入 gzip 文件的一个很好的答案。我想做的是使用dump方法直接将json序列化为GzipFile对象。

示例代码:

import gzip, json

data = # a dictionary of data here
with gzip.open(write_file, 'w') as zipfile:
   json.dump(data, zipfile)

引发的错误是

TypeError: memoryview: a bytes-like objet is required, not 'str'

我相信这是因为 gzip write() 方法需要一个字节对象传递给它。根据documentation

json 模块总是生成 str 对象,而不是 bytes 对象。 因此,fp.write() 必须支持 str 输入。

有没有办法将json 字符串输出包装为字节,以便GzipFilewrite() 处理它?或者是这样做的唯一方法是使用json.dumpsencode() 将结果字符串转换为字节对象,就像在另一个链接的答案中一样?

【问题讨论】:

  • 你能试试 data =b'' #data here'' 吗?看看它是否适合你?
  • @toheedNiaz 我澄清了问题以表明数据是字典。

标签: python json python-3.x gzip


【解决方案1】:

要将字符串转换为字节数组,您可以这样做

json.dump(bytes(data,"utf-8"), zipfile)

【讨论】:

  • 这只适用于字符串。我澄清了我正在处理dict 的问题,但我想要一个可以放入json 的通用解决方案。
【解决方案2】:

gzip 模块开箱即用地支持它:只需声明一个编码,它将在将 unicode 字符串写入文件之前将其编码为字节:

import gzip
with gzip.open(write_file, 'wt', encoding="ascii") as zipfile:
       json.dump(data, zipfile)

确保您指定使用文本模式 ('wt')。

由于 json 已经对任何非 ascii 字符进行了编码,因此 ascii 编码就足够了,但是您可以将任何其他与 ascii 兼容的编码用于前 128 个代码点,例如 Latin1、UTF-8 等

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多