使用Python GZIP解压时报Exception in Tkinter callback Traceback错误
问题根因
- 无用的JSON解析逻辑触发直接报错:你
decomp函数第一行json.loads(path)完全没有存在的必要,你传入的path参数是本地gz文件的路径字符串,不符合JSON格式要求,所以直接抛出json.decoder.JSONDecodeError,这就是你当前看到的报错的直接原因。 - gzip解压API调用逻辑错误:
gzip.decompress()方法的入参要求是已经读入内存的压缩二进制数据,不是压缩文件的路径字符串,就算你删掉JSON解析的代码,现有逻辑依然会报错。
修复后可运行代码
流式解压方案(适配大文件,无内存溢出风险)
逻辑和你已经写好的comp压缩函数对应,推荐使用:
def decomp(path): # 校验文件后缀合法性 if not path.endswith('.gz'): raise ValueError("请传入后缀为.gz的压缩文件") # 生成解压后输出路径:自动去掉.gz后缀 output_path = path[:-3] # 流式解压逻辑 with open(path, 'rb') as f_in, gzip.open(output_path, 'wb') as f_out: shutil.copyfileobj(f_in, f_out) print("Decompressed")
基于gzip.decompress的实现(仅适合小文件)
如果需要使用gzip.decompress接口,需要先读取文件的二进制内容再传入接口:
def decomp(path): if not path.endswith('.gz'): raise ValueError("请传入后缀为.gz的压缩文件") output_path = path[:-3] # 读取压缩文件的二进制内容 with open(path, 'rb') as f: compressed_data = f.read() # 解压二进制内容 decompressed_data = gzip.decompress(compressed_data) # 写入解压后的文件 with open(output_path, 'wb') as f: f.write(decompressed_data) print("Decompressed")
内容的提问来源于stack exchange,提问作者Dr_Doritos
相关产品推荐
相关产品推荐

