Python使用gzip.open处理变量中压缩文件时为何提示文件已关闭错误?
错误原因
从运行输出可以直接定位核心问题:
- 你传入
gzip.open()的bytes_db不是预期中存储压缩内容的字节变量,本身已经是一个gzip.GzipFile实例。 - 将现有gzip对象作为参数传给
gzip.open()时,gzip会自动将其作为底层流封装新的gzip实例,此时如果原bytes_db已经被提前关闭、或者封装过程中内层流被自动回收,就会触发读写操作时的文件已关闭报错。 - 如果你原本是要处理内存中存储的压缩字节内容,你的用法完全不符合接口要求:
gzip.open()默认接收本地文件路径作为第一个参数,无法直接读取内存中的字节序列。
解决方案
根据你的实际使用场景选择对应方案:
场景1:压缩内容存储在bytes类型变量中
需要先将内存中的压缩字节封装为类文件对象,再交给gzip读取:
import gzip import io # compressed_bytes为你存储压缩内容的bytes变量 with gzip.open(io.BytesIO(compressed_bytes), 'rb') as db: # 直接读取即可拿到解压后内容 content = db.read()
场景2:bytes_db本身就是已经初始化的gzip对象
不需要重复用gzip.open()封装,直接确保对象未关闭的前提下读取即可:
# 先确认对象未被提前关闭 if not bytes_db.closed: content = bytes_db.read() # 如果需要用with上下文自动管理关闭 with bytes_db as db: content = db.read()
内容的提问来源于stack exchange,提问作者philosofool
相关产品推荐
相关产品推荐

