如何结合使用json.dump与gzip?遇TypeError报错求解决
解决json.dump写入GzipFile时的TypeError问题
这个问题我之前也踩过坑,你分析的完全正确——gzip.open()默认是以二进制模式打开文件的,而json.dump()默认会输出字符串(str类型),但二进制文件对象的写入方法只接受bytes类型的数据,这就导致了那个TypeError: memoryview: a bytes-like objet is required, not 'str'错误。
下面给你两种直接用json.dump解决问题的方案:
方案1:以文本模式打开gzip文件(最简便)
直接给gzip.open()指定文本模式'wt',同时指定编码(比如utf-8),这样gzip文件对象就会自动处理字符串到字节的转换,json.dump可以直接写入:
import gzip, json data = {"name": "test", "data": [1,2,3]} # 你的数据字典 write_file = "output.json.gz" with gzip.open(write_file, 'wt', encoding='utf-8') as zipfile: json.dump(data, zipfile)
读取的时候也对应使用文本模式:
with gzip.open(write_file, 'rt', encoding='utf-8') as zipfile: loaded_data = json.load(zipfile)
方案2:用TextIOWrapper包装二进制文件对象(更灵活)
如果你需要保持gzip文件的二进制打开模式(比如有其他二进制写入需求),可以用io.TextIOWrapper把二进制的GzipFile包装成文本对象,再传给json.dump:
import gzip, json, io data = {"name": "test", "data": [1,2,3]} write_file = "output.json.gz" with gzip.open(write_file, 'wb') as zipfile: # 把二进制流包装成文本流 with io.TextIOWrapper(zipfile, encoding='utf-8') as text_stream: json.dump(data, text_stream)
这两种方案都能满足你“用dump方法直接序列化到GzipFile对象”的需求,第一种更简洁,适合大多数常规场景;第二种适合需要混合二进制和文本写入的复杂场景。
内容的提问来源于stack exchange,提问作者kingledion
相关产品推荐
相关产品推荐

