有没有办法将 `json.dump` 与 `gzip` 一起使用?
Is there a way to use `json.dump` with `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() 方法需要传递给它的字节对象。根据 documentation、
The json module always produces str objects, not bytes objects.
Therefore, fp.write() must support str input.
有没有办法将 json
字符串输出包装为字节,以便 GzipFile
的 write()
能够处理它?或者唯一的方法是使用 json.dumps
和 encode()
将结果字符串转换为字节对象,就像在其他链接的答案中一样?
要将字符串转换为字节数组,您可以这样做
json.dump(bytes(data,"utf-8"), zipfile)
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等
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、
The json module always produces str objects, not bytes objects. Therefore, fp.write() must support str input.
有没有办法将 json
字符串输出包装为字节,以便 GzipFile
的 write()
能够处理它?或者唯一的方法是使用 json.dumps
和 encode()
将结果字符串转换为字节对象,就像在其他链接的答案中一样?
要将字符串转换为字节数组,您可以这样做
json.dump(bytes(data,"utf-8"), zipfile)
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等