python临时文件+;gzip+;json转储

python临时文件+;gzip+;json转储,python,json,python-3.x,gzip,temporary-files,Python,Json,Python 3.x,Gzip,Temporary Files,我想使用python3(3.5)将非常大的字典转储到一个压缩的json文件中 但是我犯了这个错误 Traceback (most recent call last): File "test.py", line 13, in <module> json.dump(data, gzout) File "/usr/lib/python3.5/json/__init__.py", line 179, in dump fp.write(chunk) File "/u

我想使用python3(3.5)将非常大的字典转储到一个压缩的json文件中

但是我犯了这个错误

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    json.dump(data, gzout)
  File "/usr/lib/python3.5/json/__init__.py", line 179, in dump
    fp.write(chunk)
  File "/usr/lib/python3.5/gzip.py", line 258, in write
    data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'
回溯(最近一次呼叫最后一次):
文件“test.py”,第13行,在
dump(数据,gzout)
文件“/usr/lib/python3.5/json/_init__.py”,第179行,转储文件
fp.write(块)
写入文件“/usr/lib/python3.5/gzip.py”,第258行
数据=内存视图(数据)
TypeError:memoryview:需要类似字节的对象,而不是“str”

有什么想法吗?

Gzip
对象没有文本模式。因此,我将创建一个包装器作为filehandle对象传递。此包装器从json获取数据,并将其编码为二进制,以写入gzip文件:

class wrapper:
    def __init__(self,gzout):
        self.__handle = gzout
    def write(self,data):
        self.__handle.write(data.encode())
这样使用:

json.dump(data, wrapper(gzout))
每次
json.dump
想要写入对象时,都会调用
wrapper.write
方法,该方法将文本转换为二进制并写入二进制流


(来自
io
模块的一些内置包装可能也适用,但此实现简单且有效)

这正是我所需要的,即不制作数据的另一个副本,但仍然能够压缩数据并将其写入磁盘。。。谢谢你!
json.dump(data, wrapper(gzout))