有没有办法将`json.dump`和`gzip`一起使用?


问题内容

是有关如何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()方法想要将字节对象传递给它。根据文档

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

有没有一种方法来包装json串输出为字节,这样GzipFilewrite()将处理它?还是使用该方法json.dumps并将encode()结果字符串转换为bytes对象的唯一方法,如其他链接的答案一样?


问题答案:

gzip模块提供了开箱即用的支持:只需声明一种编码,它将unicode字符串编码为字节,然后再将其写入文件:

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

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

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