python 临时文件 + gzip + json 转储
python tempfile + gzip + json dump
我想使用 python3 (3.5) 将非常大的词典转储到压缩的 json 文件中。
import gzip
import json
import tempfile
data = {"verylargedict": True}
with tempfile.NamedTemporaryFile("w+b", dir="/tmp/", prefix=".json.gz") as fout:
with gzip.GzipFile(mode="wb", fileobj=fout) as gzout:
json.dump(data, gzout)
不过我遇到了这个错误。
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'
有什么想法吗?
Gzip
对象没有文本模式。所以我会创建一个包装器作为文件句柄对象传递。此包装器从 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
模块的一些内置包装器也可能适用,但此实现简单且有效)
我想使用 python3 (3.5) 将非常大的词典转储到压缩的 json 文件中。
import gzip
import json
import tempfile
data = {"verylargedict": True}
with tempfile.NamedTemporaryFile("w+b", dir="/tmp/", prefix=".json.gz") as fout:
with gzip.GzipFile(mode="wb", fileobj=fout) as gzout:
json.dump(data, gzout)
不过我遇到了这个错误。
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'
有什么想法吗?
Gzip
对象没有文本模式。所以我会创建一个包装器作为文件句柄对象传递。此包装器从 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
模块的一些内置包装器也可能适用,但此实现简单且有效)